うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】EnterPlayModeOptions が有効な際の static な領域を確認する

UnityEditor 上での再生時間短縮のために EnterPlayModeOptions を有効にしていると Unity 再生のたびに static の領域が初期化されなくなるため、その挙動を確認しておく

ただしコンパイルが走った際には static の領域が初期化されるので、コンパイルを走らせない状態で再生停止を繰り返して確認する

static なイベント

お手軽に確認できるものとして EditorApplication.playModeStateChanged を利用する

public class SampleMonoBehaviour : MonoBehaviour
{
    private void Start()
    {
        EditorApplication.playModeStateChanged += EditorApplicationOnplayModeStateChanged;       
    }

    private void EditorApplicationOnplayModeStateChanged(PlayModeStateChange obj)
    {
        Debug.Log(obj);
    }
}

static な領域は初期化されないため、再生のたびに呼ばれる回数が増えていく

イベント登録前に削除処理を入れてから登録してみる

    private void Start()
    {
        EditorApplication.playModeStateChanged -= EditorApplicationOnplayModeStateChanged;
        EditorApplication.playModeStateChanged += EditorApplicationOnplayModeStateChanged;       
    }

こちらでも変わらず増えていく

次に OnDisable で削除処理を行ってみる

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

重複はしなくなった

ただし playModeStateChanged 的にはイベントが取れないので別の処理を考える必要がありそう

static なフィールド

    private static List<int> _values = new List<int>();
 
    private void Start()
    {
        Debug.Log(_values.Count);
        _values.Add(1);
    }

初期化されず増えていく ※シリアライズできないクラスのListであっても同様初期化はされない

そのため、前の値が残っていると問題が起きるのであれば正しく初期化する必要がありそうです