はじめに
この前、Unityでゲーム開発してるときにシーンやプレハブを開いただけでコンストラクタ内のDebug.Log
が処理されていたので「なんで?」って思って軽く調べてみました。
(↓のような感じです)
public class Const : MonoBehaviour { Const() { Debug.LogError("コンストラクターです"); } }
シリアライズ化されるタイミングでコンストラクタが実行される
調べたところ、MonoBehabior
で継承されたクラスのコンストラクタは、シリアライズ化されるタイミングでコンストラクタが実行されるようです。シーンやプレハブを開いたときにシリアライズ化されているみたいですね。
シリアル化は、データ構造やオブジェクトの状態を Unity が保存して後で再構成できる形式に変換する自動プロセスです。 Unityのビルトイン機能の中には、シリアル化を使用するものがあります。保存とロード、インスペクターウィンドウ、インスタンス化、プレハブなどの機能が含まれます。
https://docs.unity3d.com/ja/current/Manual/script-Serialization.html
EditorApplication.isPlayingで防ごうとしたらどうなるか
↓のような感じでEditorApplication.isPlaying
で一部分だけ防ごうとしたら、コンストラクタ内では使用できませんよってUnityに怒られました。
public class Const : MonoBehaviour { Const() { if (EditorApplication.isPlaying) { Debug.LogError("コンストラクターです"); } } }
EditorApplication.isPlaying
は,エディターが再生モードかどうかの判定フラグ。
EditorApplication-isPlaying - Unity スクリプトリファレンス