UnityのMonoBehaviourは特別なクラスです。
GameObjectにアタッチできるC#Script
C#Scriptを生成するとデフォルトでMonoBehaviourからの派生クラスとなっています。基底クラスを変更することもできますが、MonoBehaviourからの派生クラスでないとGameObjectにアタッチ(Component登録)できません。アタッチするにはクラス名とファイル名が一致している必要もあります。
newは禁止
MonoBehaviour及びその派生クラスはnewによるインスタンス生成はできません。GameObjectが生成されたときにアタッチされているC#Scriptコンポーネントはそのときにインスタンス生成されます。
メッセージ
MonoBehaviourはStartやUpdate等の決まったメソッドを定義するとイベント発生時に呼ばれます。
初期化
C#のクラスの初期化は通常コンストラクタで行います。ですが、MonoBehaviourの派生クラスの初期化はコンストラクタではなく、Awake、OnEnable、Startメソッドで行います。
コンストラクタ
Inspector上で設定した値が反映される前に呼ばれます。UnityEditorのPlay、Play終了操作で複数回呼ばれているようです。副作用のある処理は行わない方が無難です。
Awake
GameObjectが初めてアクティブになったときにAwake()が一回だけ呼ばれます。例えば、次のようなときです。
- Inspector上でGameObjectの左のチェックボックスのチェックが入っている状態でインスタンス生成されたとき。
- Inspector上でGameObjectの左のチェックボックスにチェックが入っていない状態でSetActive(true)されたとき。
- C#ScriptでinstantiateやGameObject.CreatePrimitive等で動的に生成されたとき。
Inspectorの設定は反映されています。
同時期にインスタンス生成された他のGameObjectにアタッチされているC#ScriptコンポーネントはまだAwakeが呼ばれていない可能性があります。
OnEnable
GameObjectが初めてアクティブになったときにAwakeの後に呼ばれます。非アクティブになり再びアクティブになったときは毎回呼ばれます。
同時期にインスタンス生成された他のGameObjectにアタッチされているC#ScriptコンポーネントはまだAwake、OnEnableが呼ばれていない可能性があります。
Start
GameObjectが初めてアクティブになったときにAwake、OnEnableの後に一回だけ呼ばれます。
同時期にインスタンス生成されたGameObjectにアタッチされたC#ScriptのAwakeやOnEnableは呼ばれています。
ループ
アクティブのときにUpdateやFixedUpdateが呼ばれます。UpdateとFixedUpdateが呼ばれる順番は一定ではありません。
Update
フレーム毎に呼ばれます。呼ばれる間隔は一定ではありません。前回呼ばれてからの時間はTime.deltatimeから取得できます。キー入力等のInputはFixedUpdateではなくここで処理します。
FixedUpdate
一定時間間隔で呼ばれます。物理演算前に呼ばれます。
終了処理
OnDisable
非アクティブになったときに呼ばれます。アクティブ・非アクティブを繰り返すGameObjectでは非アクティブになる度に呼ばれます。
OnDestory
一度でもアクティブになったことがあればシーンの終了時やゲームの終了時等で呼ばれます。呼ばれるタイミングは制御できません。
コメント