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であっても同様初期化はされない
そのため、前の値が残っていると問題が起きるのであれば正しく初期化する必要がありそうです