ルルのゲーム開発備忘録

主にUnityやC#に関する情報を気まぐれに投稿していきま~す

【Unity】UnityEditorで再生してないのにコンストラクタ内の処理が実行される

はじめに

この前、Unityでゲーム開発してるときにシーンやプレハブを開いただけでコンストラクタ内のDebug.Logが処理されていたので「なんで?」って思って軽く調べてみました。
(↓のような感じです)

public class Const : MonoBehaviour
{
    Const()
    {
        Debug.LogError("コンストラクターです");
    }
}
コンストラクタ実行
コンストラクタ実行

シリアライズ化されるタイミングでコンストラクタが実行される

調べたところ、MonoBehabiorで継承されたクラスのコンストラクタは、シリアライズ化されるタイミングでコンストラクタが実行されるようです。シーンやプレハブを開いたときにシリアライズ化されているみたいですね。

シリアル化は、データ構造やオブジェクトの状態を Unity が保存して後で再構成できる形式に変換する自動プロセスです。 Unityのビルトイン機能の中には、シリアル化を使用するものがあります。保存とロード、インスペクターウィンドウ、インスタンス化、プレハブなどの機能が含まれます。

https://docs.unity3d.com/ja/current/Manual/script-Serialization.html


【参考】
www.hanachiru-blog.com

EditorApplication.isPlayingで防ごうとしたらどうなるか

↓のような感じでEditorApplication.isPlayingで一部分だけ防ごうとしたら、コンストラクタ内では使用できませんよってUnityに怒られました。

public class Const : MonoBehaviour
{
    Const()
    {
        if (EditorApplication.isPlaying) {
            Debug.LogError("コンストラクターです");
        }
    }
}

EditorApplication.isPlayingは,エディターが再生モードかどうかの判定フラグ。
EditorApplication-isPlaying - Unity スクリプトリファレンス

まとめ

MonoBehaviour継承したコンストラクタ内の処理は少し注意したほうがよさそうですね。初期化処理とかはAwakeやStartでやったり、データ用のクラスであればMonoBehaviour継承していないクラスのコンストラクタで書いてNewしてインスタンス作るのがよさげかな。