ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity学習#31-3 加算シーンに関するいくつかの調査 (Unity 2019.4.4f1)

今回は加算シーンについて。加算シーンを使って、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);
}
f:id:tomo_mana:20210410000007p:plain
加算シーン - LoadSceneAsync前後のログ

LoadSceneAsync() の直前ではシーン名が取得できませんが、直後ではシーン名が取得できます。これを利用して、シーンがすでに起動されたかどうか知ることができそうです。
また、GetSceneByName() は、ロードされていなくても何らかのオブジェクトが取得できることが分かります。
Unity Script Reference には、"Invalid Reference"と書いてあります。Nullオブジェクト?)


シーンはいつロードされたと認識する?:sceneLoadedコールバック

⇒ 新しくシーンがロードされた時、Awake()、Enable() 実行の後、Start() の前に他の全シーンに通知される

たとえば、シーンA、Bが起動した状態で、BがCを加算ロードした時、以下のように動作しました。

f:id:tomo_mana:20210410003345p:plain
SceneLoadedコールバック

実際には、シーン自体は構造体なので、Awake() などのイベントが来るのはシーンに属するゲームオブジェクト群です。

シーンはActiveでなくても他のシーンを起動できる?

⇒起動できる

たとえば、シーンAがBを加算ロードし、Bが起動中にCを加算ロードすると、以下のように動作しました。

f:id:tomo_mana:20210410082724p:plain
非Active状態でシーンロード

BはActiveではありませんが、Cを加算ロードできます。


(以上)