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で最初に呼ばれるメソッドを指定する方法を説明しました。

適切に初期化処理を配置することで、ゲームのパフォーマンスと安定性を向上させることが可能です。

具体的には、ゲームの設定データを読み込んだり、シングルトンオブジェクトを初期化したりする際に利用できます。

これらのメソッドは、ゲームの開始時に一度だけ呼び出されるため、リソースのロードや一部の設定を適切に行うのに役立ちます。

🔗関連ページ