コガネブログ

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

【Unity】RuntimeInitializeOnLoadMethod のタイミングではゲームオブジェクトを生成できないことがある

検証環境

  • Unity 2020.1.6f1
  • Android 8.0.0

概要

using UnityEngine;

public class Example : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.AfterSceneLoad )]
    private static void InitializeAfterSceneLoad()
    {
        new GameObject( nameof( RuntimeInitializeLoadType.AfterSceneLoad ) );
    }

    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSceneLoad )]
    private static void InitializeBeforeSceneLoad()
    {
        new GameObject( nameof( RuntimeInitializeLoadType.BeforeSceneLoad ) );
    }

    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.AfterAssembliesLoaded )]
    private static void InitializeAfterAssembliesLoaded()
    {
        new GameObject( nameof( RuntimeInitializeLoadType.AfterAssembliesLoaded ) );
    }

    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSplashScreen )]
    private static void InitializeBeforeSplashScreen()
    {
        new GameObject( nameof( RuntimeInitializeLoadType.BeforeSplashScreen ) );
    }

    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.SubsystemRegistration )]
    private static void InitializeSubsystemRegistration()
    {
        new GameObject( nameof( RuntimeInitializeLoadType.SubsystemRegistration ) );
    }

    private void OnGUI()
    {
        GUI.color = Color.white;

        foreach ( var x in FindObjectsOfType<Transform>() )
        {
            GUILayout.Label( x.name );
        }
    }
}

上記のように RuntimeInitializeOnLoadMethod のタイミングで new GameObject する場合、
Unity エディタ上ではどのタイミングでもゲームオブジェクトが生成されるが
例えば Android の Mono2x ビルドや IL2CPP ビルドで作成したアプリでは

  • AfterSceneLoad
  • BeforeSceneLoad

のタイミングならゲームオブジェクトは生成され、

  • AfterAssembliesLoaded
  • BeforeSplashScreen
  • SubsystemRegistration

のタイミングだとゲームオブジェクトは生成されない