今回は加算シーンについて。加算シーンを使って、2段階以上のシーンロードができるのかが分からなかったので、以下について調べました。
2段階以上のシーンロードと私が勝手に呼んでいるのは、たとえばシーンAがシーンBをロードする時に、シーンBがシーンCをロードする、といったロードの仕方です。これができると、作業分担しやすくなるのではと考えています。
tomo-mana.hatenablog.com
シーンはいつからロード済み?:GetSceneByName()
⇒ GetSceneByName() は、LoadSceneAsync() の直後から取得可能
たとえば、Start() 時に新しいシーンをロードする時、ロードの前後にログを入れてみます。
string sceneChild = "FieldScene"; void Start(){ Debug.Log("Before LoadSceneAsync: sceneChild = " + SceneManager.GetSceneByName( sceneChild ).name); SceneManager.LoadSceneAsync( sceneChild, LoadSceneMode.Additive ); Debug.Log("After LoadSceneAsync: sceneChild = " + SceneManager.GetSceneByName( sceneChild ).name); }
LoadSceneAsync() の直前ではシーン名が取得できませんが、直後ではシーン名が取得できます。これを利用して、シーンがすでに起動されたかどうか知ることができそうです。
また、GetSceneByName() は、ロードされていなくても何らかのオブジェクトが取得できることが分かります。
(Unity Script Reference には、"Invalid Reference"と書いてあります。Nullオブジェクト?)
シーンはいつロードされたと認識する?:sceneLoadedコールバック
⇒ 新しくシーンがロードされた時、Awake()、Enable() 実行の後、Start() の前に他の全シーンに通知される
たとえば、シーンA、Bが起動した状態で、BがCを加算ロードした時、以下のように動作しました。
実際には、シーン自体は構造体なので、Awake() などのイベントが来るのはシーンに属するゲームオブジェクト群です。
シーンはActiveでなくても他のシーンを起動できる?
⇒起動できる
たとえば、シーンAがBを加算ロードし、Bが起動中にCを加算ロードすると、以下のように動作しました。
BはActiveではありませんが、Cを加算ロードできます。
(以上)