🚀
Unityどのシーンから起動しても共通の初期化 SceneInBuild
[RuntimeInitializeOnLoadMethod]を使う
GameObjectにアタッチ不要
"InitializeScene"を作っておく
ゲームを再生すると、カレントシーンにInitializeSceneを追加ロードします。どのシーンから起動してもInitializeSceneは必ず追加ロードされる。
デバッグ用のマネージャクラスなど、どのシーンから起動しても処理したいものはInitializeScene に置いて運用する
Initialize.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class Initialize
{
private const string InitializeSceneName = "InitializeScene";
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public static void RuntimeInitializeApplication()
{
Debug.Log("RuntimeInitializeApplication");
if (!SceneManager.GetSceneByName(InitializeSceneName).IsValid())
{
SceneManager.LoadScene(InitializeSceneName, LoadSceneMode.Additive);
}
}
}
InitializeSceneは、SceneInBuildの最後に配置しておく必要がある
処理の流れ
現在のシーンのオブジェクトが先に処理される
AwakeやStartに書く処理がInitializeSceneのオブジェクトに依存しないように
1.RuntimeInitializeApplicationが呼び出される
2.現在のシーンのオブジェクトのAwakeが呼び出される
3.InitlizeシーンのオブジェクトのAwakeが呼び出される
4.現在のシーンのオブジェクトのStartが呼び出される
5.InitlizeシーンのオブジェクトのStartが呼び出される
例えば、Start時にBGMを再生したい場合は4でコルーチンを起動し、WaitForEndOfFrameしてからSimpleSoundManager.Instanceでアクセスして処理する
2の時点ではSimpleSoundManagerは存在しないので、参照してはいけません
Splash Screenの設定を変えたらセーフエリアが取得できなくなった
シーンランチャー
SceneLauncher.cs
using UnityEditor;
using UnityEditor.SceneManagement;
public static class SceneLauncher
{
[MenuItem("Launcher/GameScene", priority = 0)]
public static void OpenGameScene()
{
EditorSceneManager.OpenScene("Assets/Scenes/GameScene.unity", OpenSceneMode.Single);
}
[MenuItem("Launcher/SampleScene", priority = 0)]
public static void OpenSampleScene()
{
EditorSceneManager.OpenScene("Assets/Scenes/SampleScene.unity", OpenSceneMode.Single);
}
[MenuItem("Launcher/TitleScene", priority = 0)]
public static void OpenTitleScene()
{
EditorSceneManager.OpenScene("Assets/Scenes/TitleScene.unity", OpenSceneMode.Single);
}
}
シーンアンロード
シーンの一覧
Discussion