Unity

【Unity】Sceneのロードとアンロード

2020-11-01

バージョン

Unity:2020.1.4f1

 

Scene遷移する方法(時間がない方向け)

まずは、時間がない方のためにかなりシンプルに遷移する方法を説明します!

 

はじめに

using UnityEngine.SceneManagement;

を忘れずにソースコードに追加しましょう!

あとは以下のコードを実行すれば画面遷移することができます

SceneManager.LoadScene("遷移したいScene名");

かなり簡単ですね笑

 

SceneManager.LoadScene()って他に何ができるのと思ったので少し詳しく調べてみました

 

SceneManager.LoadScene()について

SceneManager.LoadSceneのアセンブリを見ると

SceneManager.LoadSceneのアセンブリ

5つのオーバーロードがあることがわかりました

一つずつ見ていきましょう

SceneManager.LoadScene(Int32)

これは引数にScene番号を指定してやることでそのSceneに移動できるメソッドです

Scene番号というのは下画像の青枠内の番号です

Scene番号

 

SceneManager.LoadScene(Int32, LoadSceneMode)

第一引数は先ほどと同じですね、第二引数のLoadSceneModeは初めて出てきたので少し調べてみました

LoadSceneModeには「Single」と「Additive」の2種類あるみたいで、それぞれ以下のような違いがあります

※ちなみに上のSceneManager.LoadScene(Int32)のように第二引数を指定しなければSingleになるみたいです

 

Single

Scene遷移するときに現在のSceneを閉じて新しいSceneをロードする方法です

Additive

Scene遷移するときに現在のSceneを閉じずに新しいSceneをロードする方法です

実際に画面遷移してみると下画像のようにシーンがどんどん増えていきます

LoadSceneMode.Additive実行

どんどん増え続けていくのはあまりよろしくないので、AdditiveしたSceneはアンロードする必要があります(Sceneのアンロードに関しては後述します)

SceneManager.LoadScene(String, LoadSceneParameters)

他のメソッドと違い、これは戻り値がSceneとなっているのでScene遷移するというよりは、何かしらのSceneを取得するといったほうが正しいんですかね

第一引数にはシーン名をいれれば良いことは想像できるのですが、第二引数のLoadSceneParametersに関してはより詳しく分かってから追記していきます!

SceneManager.LoadScene(String)

これは、SceneManager.LoadScene(Int)と違い、シーン名を指定することで画面遷移を行うことができるメソッドです

SceneManager.LoadScene(String, LoadSceneMode)

これも先ほど説明したSceneManager.LoadScene(Int32, LoadSceneMode)と同じなので省略します。

違いは遷移先のSceneをシーン名で指定するか、シーン番号で指定するかの違いです!

 

Sceneのアンロードについて

Additiveして、使わなくなったシーンは明示的にアンロードしなくてはなりません

その方法を記載していきます。昔は、

SceneManager.UnloadScene("アンロードしたいScene名");

でできたのですが、今は非推奨となっているので「SceneManager.UnloadSceneAsync()」を使いましょう、(Asyncとついているのでおそらくこれは非同期処理ですね)

SceneManager.UnloadSceneAsync()について

あまり詳しくないので調べてみると、6個のオーバーロードがありましたSceneManager.UnloadSceneAsyncのアセンブリ

上から順番にみていきましょう

SceneManager.UnloadSceneAsync(Scene, UnloadSceneOptions)

第一引数:Scene

先ほど出てきたSceneManager.LoadScene(String, LoadSceneParameters)などでSceneを取得することができます

第二引数:UnloadSceneOptions

正直よくわからないのですが、以下の2種類設定することができてそれぞれ

・UnloadSceneOptions.None:シーン内の全てのオブジェクトをアンロードする

・UnloadSceneOptions.UnloadAllEmbeddedSceneObjects:他のシーンで参照できるアセットをアンロードしない

って感じなのかな?

SceneManager.UnloadSceneAsync(String, UnloadSceneOptions)

これは先ほど説明したものの第一引数がStringになったものですね(第二引数は省略します)

第一引数:String

シーン名を指定することでそのシーンをアンロードする

SceneManager.UnloadSceneAsync(Int, UnloadSceneOptions)

これも先ほど説明したものの第一引数がIntになっただけのものですね(第二引数は省略します)

第一引数:Int

シーン番号を指定することでそのシーンをアンロードする

SceneManager.UnloadSceneAsync(Scene)

特にオプションを指定せずに、特定シーンのアンロードを行います

SceneManager.UnloadSceneAsync(String)

特にオプションを指定せずに、指定シーン名のアンロードを行います

SceneManager.UnloadSceneAsync(Int)

特にオプションを指定せずに、指定シーン番号のアンロードを行います

 

 

 

参考URL

SceneManagement.LoadSceneMode.Additive-Unity-Manual

SceneManager.UnloadSceneAsync-Unity-Manual

-Unity

© 2024 ITime