コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity 2019.1 や 2019.2 から RuntimeInitializeOnLoadMethod の引数に渡せる列挙型の種類が増えていた

はじめに

using UnityEngine;

public class Example : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSceneLoad )]
    private static void Init()
    {
        Debug.Log( "ピカチュウ" );
    }
}

ゲーム開始時に関数を呼び出してくれる RuntimeInitializeOnLoadMethod 属性の
引数に渡せる列挙型の種類が増えていました

Unity 2019.1 から追加されたもの

https://docs.unity3d.com/2019.1/Documentation/ScriptReference/RuntimeInitializeLoadType.html

  • BeforeSplashScreen
    • スプラッシュスクリーンの前に呼び出される
  • AfterAssembliesLoaded
    • すべてのロードされたアセットが初期化された後に呼び出される
using UnityEngine;

public class Example : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSplashScreen )]
    private static void InitBeforeSplashScreen()
    {
        Debug.Log( "スプラッシュスクリーンの前に呼び出される" );
    }
    
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.AfterAssembliesLoaded )]
    private static void InitAfterAssembliesLoaded()
    {
        Debug.Log( "すべてのロードされたアセットが初期化された後に呼び出される" );
    }
}

Unity 2019.2 から追加されたもの

https://docs.unity3d.com/2019.2/Documentation/ScriptReference/RuntimeInitializeLoadType.html

  • SubsystemRegistration
    • サブシステムの登録時に呼び出される
using UnityEngine;

public class Example : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.SubsystemRegistration )]
    private static void InitSubsystemRegistration()
    {
        Debug.Log( "サブシステムの登録時に呼び出される" );
    }
}

呼び出される順番の検証

検証用スクリプト

using UnityEngine;

public class Example : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSceneLoad )]
    private static void InitBeforeSceneLoad()
    {
        Debug.Log( "BeforeSceneLoad" );
    }
    
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.AfterSceneLoad )]
    private static void InitAfterSceneLoad()
    {
        Debug.Log( "AfterSceneLoad" );
    }
    
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.AfterAssembliesLoaded )]
    private static void InitAfterAssembliesLoaded()
    {
        Debug.Log( "AfterAssembliesLoaded" );
    }
    
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSplashScreen )]
    private static void InitBeforeSplashScreen()
    {
        Debug.Log( "BeforeSplashScreen" );
    }
    
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.SubsystemRegistration )]
    private static void InitSubsystemRegistration()
    {
        Debug.Log( "SubsystemRegistration" );
    }
}

Unity エディタ上の場合

f:id:baba_s:20191105234739p:plain

AfterAssembliesLoaded と BeforeSplashScreen は呼び出されない

PC Standalone ビルドの場合

以下の順番で呼び出される

  1. SubsystemRegistration
  2. AfterAssembliesLoaded
  3. BeforeSplashScreen
  4. BeforeSceneLoad
  5. AfterSceneLoad