Enter Play Mode Options

  • 「Enter Play Mode Options」を有効にすると、スクリプトやシーンの読み込みを省略するため、再生モードの開始が劇的に高速となる。
  • スクリプトの実装によっては、上手く初期化されないケースがある。
    • 静的変数が初期化されない。
    • 静的イベントが初期化されない。
  • 必要に応じて、「Reload Domain」あるいは「Reload Scene」のオプションを有効にする。

ドキュメント:

設定可能な再生開始時モード | Unity マニュアル [公式]

使い方

手順

メニューから「編集 > プロジェクト設定」 (Edit > Project Settings) を開き、「Editor」タブに切り替えて、「Enter Play Mode Setting」の項目を設定する。

設定
  • Enter Play Mode Options 再生モード開始時の読み込みオプションを有効にする (デフォルト無効/※実験的機能)
    • Reload Domain スクリプトを再読み込みする (デフォルト無効)
    • Reload Scene シーンを再読み込みする (デフォルト無効)

ドキュメント:

設定可能な再生開始時モード | Unity マニュアル [公式]

Domain Reload | Unity マニュアル [公式]

Reload Scene | Unity マニュアル [公式]

Reload Domain と Reload Scene の無効化の詳細 | Unity マニュアル [公式]

参考:

Enter Play Mode Options で Editor 再生開始を早くする | KAZUPON 研究室

Enter Play Mode Settings – エディタ再生開始前の待ち時間を最大90%も削減する | kan のメモ帳

Enter Play Mode Options を設定すると爆速になった | TAKOYAKING’s blog

Unity 2019.3 には高速にプレイモードを開始する実験機能が存在する | コガネブログ

ゲームを再生する時間を短くする Configurable Enter Play Mode とは | 宴

Enter Play Mode Options – ゲーム再生までの時間を短くする | タニスゲームス

驚愕の超速イテレーションデバッグ設定 | maruton

Unity 2019.3 で再生モードへの素早い切り替えが可能に | Unity Blog [公式]

Insanely fast enter to play mode – Unity Forum

Long time to enter play mode – Unity Forum

静的変数を初期化する

ドメインリロードを省略した場合、再生モードの開始時に静的変数が初期化されなくなるため、RuntimeInitializeOnLoadMethod 属性を付与した静的メソッドで明示的に初期化する。

public class Example : MonoBehaviour
{
    static bool initialized = false;

    [RuntimeInitializeOnLoadMethod(
        RuntimeInitializeLoadType.SubsystemRegistration)]
    static void Init()
    {
        initialized = true;
    }
}Code language: C# (cs)
仕様
  • ゲームがランタイムで読み込まれる際に、一連の Awake メソッドの後に呼び出される。
  • 複数のメソッドに属性を付与した場合、実行順序は保証されない。

ドキュメント:

UnityEngine.RuntimeInitializeOnLoadMethodAttribute | Unity スクリプトリファレンス [公式]

参考:

Unity 2019.3 には高速にプレイモードを開始する実験機能が存在する | コガネブログ

エディターウィンドウ

カスタムエディターウィンドウで、再生モードの開始時に処理を適用するには、EditorApplication.playModeStateChanged イベントにハンドラを追加して、状態を判別して処理を実行する。

public class ExampleWindow : EditorWindow
{
    [MenuItem("Tools/Example Window")]
    public static void OpenTestWindow()
    {
        GetWindow<ExampleWindow>("Example");
    }

    private void OnEnable()
    {
        EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
        EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
    }

    private void OnDisable()
    {
        EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
    }

    private void OnPlayModeStateChanged(PlayModeStateChange state)
    {
        if (state == PlayModeStateChange.EnteredPlayMode)
        {
            Debug.Log("Entered Play Mode in Example Window!");
        }
    }
}Code language: C# (cs)

ドキュメント:

EditorApplication.playModeStateChanged | Unity スクリプトリファレンス [公式]

PlayModeStateChange | Unity スクリプトリファレンス [公式]

参考:

How to tell when returned to editor mode from play mode? (EditorWindow) – Unity Forum

プライベート配列がヌルに初期化されない

現象:

praivate または internal が指定された配列、または、リストが null に初期化されない。

対処法:

  • 該当する配列、または、リストに NonSerialized 属性を付与する。

参考:

Just so you know, the generic workaround that WE found is… (Hyp-X) – Unity Forum

Unassigned private array field is not null when entering play mode with Reload Domain & Scene disabled – Unity Issue Tracker

Awake が呼び出されない

現象:

シーンの再読み込みを省略すると、クラスに ExecuteInEditMode 属性、または、ExecuteAlways 属性が指定されている場合、Awake メソッドが呼び出されなくなる。これは現在のところ、ドメインリロードを省略した場合の仕様となっている。(既知の問題)

代替
  • OnEnable
  • Start

参考:

Awake is no longer called for some MonoBehaviour types – Unity Forum

Small bug with Play Mode Options and Awake method on scripts that are marked EecuteInEditMode – Unity Forum

InitializeOnEnterPlayMode

※ Unity 2019.3 以降

エディターで再生モード開始時に呼び出したい静的メソッドに InitializeOnEnterPlayMode 属性を付与する。

public class Example : MonoBehaviour
{
#if UNITY_EDITOR
    [InitializeOnEnterPlayMode]
    static void Init(EnterPlayModeOptions options)
    {
        Debug.Log("Entering Play Mode");
    }
#endif
}Code language: C# (cs)

ドキュメント:

UnityEditor.InitializeOnEnterPlayModeAttribute | Unity スクリプトリファレンス [公式]

参考:

InitializeOnEnterPlayMode 属性を指定した関数は再生時に呼び出される | コガネブログ

Play ボタン押したときにメソッドを実行したいときの新機能 | ハルシオンシステムの気ままBlog

Would you use such boilerplate to catch EnterPlaymode and do reset or other Editor work for game code? (Alexey Zakharov) – Unity Forum

初期化サイクル

ドキュメント:

Reload Domain と Reload Scene の無効化の詳細 | Unity マニュアル [公式]

参考:

When updating internal projects to use the feature I kept those statements in mind (Alexey Zakharov) – Unity Forum

フォーラム

Configurable Enter Play Mode – Unity Forum

API

UnityEngine.RuntimeInitializeOnLoadMethodAttribute | Unity スクリプトリファレンス [公式]

UnityEditor.InitializeOnEnterPlayModeAttribute | Unity スクリプトリファレンス [公式]

EditorApplication.playModeStateChanged | Unity スクリプトリファレンス [公式]

PlayModeStateChange | Unity スクリプトリファレンス [公式]

EditorSettings.enterPlayModeOptionsEnabled | Unity スクリプトリファレンス [公式]

EditorSettings.enterPlayModeOptions | Unity スクリプトリファレンス [公式]

EnterPlayModeOptions | Unity スクリプトリファレンス [公式]

まとめ

ゲームを再生する時間を短くする Configurable Enter Play Mode とは | 宴

チュートリアル

開発効率アップ! Enter Play Mode オプション解説 (Unity Japan)

Enter Play Mode Settings – ゲームの調整を楽にする (Unity Japan)

Enter Play Mode Faster (passivestar)

Enter Play Mode Menu Item

リポジトリ:

baba-s/Kogane.EnterPlayModeMenuItem: メニューから Enter Play Mode の有効/無効を変更できるエディタ拡張 – GitHub

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA