Unityで最初に呼ばれる処理
Unity
では、特定の属性を使用して、特定のタイミングで最初に呼ばれる処理を制御することができます。
これらの属性を理解し、適切に使用することで、ゲーム開発の効率性と品質を向上させることができます。
UnityEditor上で最初に呼ばれる処理
UnityEditor
上で最初に呼ばれるメソッドは属性を使って指定することが出来ます。
呼ばれるタイミングは、
UnityEditor
の起動時- スクリプト更新時
- エディター上での実行時
です。
これらはUnityEditor
上のみで使用でき、ビルドした後のアプリでは呼ばれません。
InitializeOnLoad
InitializeOnLoad
属性をクラスにつけるとそのクラスのstatic
なコンストラクタが呼ばれます。
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
public class InitializeOnLoadTest
{
static InitializeOnLoadTest()
{
Debug.Log("InitializeOnLoadTest");
}
}
InitializeOnLoadMethod
InitializeOnLoadMethod
属性をstatic
なメソッドにつけると、実行されるようになります。
コンストラクタ以外のメソッドに属性を指定します。
using UnityEditor;
using UnityEngine;
public static class InitializeOnLoadMethodTest
{
[InitializeOnLoadMethod]
private static void Initialize()
{
Debug.Log("InitializeOnLoadMethod");
}
}
InitializeOnEnterPlayMode
InitializeOnEnterPlayMode
属性を使用すると、UnityEditor
上でPlay
モードに入るタイミングでメソッドを呼ぶことが出来ます。
using UnityEditor;
using UnityEngine;
public static class InitializeOnEnterPlayModeTest
{
[InitializeOnEnterPlayMode]
static void EnterPlayMode()
{
Debug.Log("EnterPlayMode");
}
}
実行時に最初に呼ばれる処理
RuntimeInitializeOnLoadMethod
RuntimeInitializeOnLoadMethod
属性を使用すると、実行時に最初に呼ばれるメソッドを指定することが出来ます。
InitializeOnLoadMethod
のランタイム版ですね。
UnityEditor
でプレイモードに入る時も呼ばれますし、ビルド後のアプリでも起動時に呼ばれます。
using UnityEngine;
public static class RuntimeInitializeOnLoadMethodTest
{
[RuntimeInitializeOnLoadMethod]
private static void Initialize()
{
Debug.Log("RuntimeInitializeOnLoadMethod");
}
}
RuntimeInitializeOnLoadMethod
属性に引数を渡すことで、呼ばれるタイミングを調整することが出来ます。
using UnityEngine;
public static class RuntimeInitializeOnLoadMethodTest
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void Initialize()
{
Debug.Log("RuntimeInitializeOnLoadMethod");
}
}
指定できる引数は以下のものになります。
引数 | 説明 |
AfterAssembliesLoaded | アセンブリが読み込まれた後、初めてのフレームの開始前にメソッドが呼び出されます。 |
BeforeSceneLoad | シーンの読み込み前にメソッドが呼び出されます。通常、初期化コードに使用されます。 |
AfterSceneLoad | シーンの読み込み後にメソッドが呼び出されます。シーン内のオブジェクトに依存する初期化コードに使用されます。 |
BeforeSplashScreen | スプラッシュスクリーンの表示前にメソッドが呼び出されます。スプラッシュスクリーンが表示される前に実行する必要がある初期化コードに使用されます。 |
SubsystemRegistration | サブシステムの登録前にメソッドが呼び出されます。Unity 2019.2以降でサブシステムの初期化に使用されます。 |
全て試したサンプルコードが以下のものになります。
using UnityEngine;
public class RuntimeInitializeOnLoadMethodTest
{
// アセンブリが読み込まれた後に呼び出されるメソッド
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
private static void OnAfterAssembliesLoaded()
{
Debug.Log("After assemblies loaded");
}
// シーンの読み込み前に呼び出されるメソッド
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void OnBeforeSceneLoad()
{
Debug.Log("Before scene load");
}
// シーンの読み込み後に呼び出されるメソッド
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void OnAfterSceneLoad()
{
Debug.Log("After scene load");
}
// スプラッシュスクリーンの表示前に呼び出されるメソッド
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
private static void OnBeforeSplashScreen()
{
Debug.Log("Before splash screen");
}
// サブシステムの登録前に呼び出されるメソッド
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void OnSubsystemRegistration()
{
Debug.Log("Before subsystem registration");
}
}
まとめ
Unity
で最初に呼ばれるメソッドを指定する方法を説明しました。
適切に初期化処理を配置することで、ゲームのパフォーマンスと安定性を向上させることが可能です。
具体的には、ゲームの設定データを読み込んだり、シングルトンオブジェクトを初期化したりする際に利用できます。
これらのメソッドは、ゲームの開始時に一度だけ呼び出されるため、リソースのロードや一部の設定を適切に行うのに役立ちます。