MRが楽しい

MRやVRについて学習したことを書き残す

Unityでスクリプトから再生開始/停止の状態変化を取得する

本日はUnityの小ネタ枠です。
Unityでスクリプトから再生開始/停止の状態変化を取得する手順についてです。

スクリプトから再生開始/停止の状態変化を取得する

EditorApplication-playModeStateChangedは再生開始/停止の状態変化を通知します。
この通知を受け取るには事前にイベントハンドラーを追加しておく必要があります。
docs.unity3d.com
docs.unity3d.com

以下のタイミングで通知が行われ、引数からどの状態変化が発生したか取得できます。

状態名 説明
EnteredEditMode 再生モードから編集モードに切り替わった次のタイミングで発生します
ExitingEditMode 編集モードが終了したタイミングで発生します
EnteredPlayMode 編集モードから再生モードに切り替わった次のタイミングで発生します
ExitingPlayMode 再生モードが終了したタイミングで発生します

イベントハンドラーは再生開始を行う前に追加する必要があるのでInitializeOnLoadAttributeまたはInitializeOnLoadMethodを利用して登録しておきます。

サンプルスクリプト

以下のplayModeStateChangedの通知を利用して、再生開始時に特定のシーンに切り替えを行うサンプルスクリプトを作成しました。
・PlayModeStateChangedTest.cs

using UnityEditor;

public class PlayModeStateChangedTest
{
    // 再コンパイル時に本メソッドが実行される
    [InitializeOnLoadMethod]
    static void Initialize()
    {
        // プレイモードの状態変化を監視するイベントハンドラーを登録
        EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
    }

    static void OnPlayModeStateChanged(PlayModeStateChange state)
    {
        // プレイモードの開始時にシーンを切り替える
        if (state == PlayModeStateChange.EnteredPlayMode)
        {
            // 再生シーンを読み込む
            // 対象のシーンはBuild Settingsに登録しておく必要がある
            UnityEngine.SceneManagement.SceneManager
                .LoadSceneAsync("Assets/Sandbox/PlayModeStateChangedTest/Scenes/PlayModeStateChangedTest.unity");
        }
    }
}

以下の通り、シーンを再生するとその状態変化を検知して再生するシーンが切り替えられました。