本日は Unity の小ネタ枠です。
MonoBeheviour を継承した場合のライフサイクル関数の呼び出しを試したので記事にします。
サンプルコード
以下の通り、ライフサイクル関数のアクセス修飾子を変えて MonoBeheviour を継承した場合の動作を確認しました。
privateの場合
・Food.cs
using UnityEngine; namespace LifeCycle { public class Food : MonoBehaviour { void Start() { Debug.Log("Food Behaviour"); } } }
・Meat.cs
using UnityEngine; namespace LifeCycle { public class Meat : Food { } }
protectedの場合
・Toy.cs
using UnityEngine; namespace LifeCycle { public class Toy : MonoBehaviour { protected void Start() { Debug.Log("Toy Behaviour"); } } }
・Ball.cs
using UnityEngine; namespace LifeCycle { public class Ball : Toy { } }
動作確認
それぞれ継承クラスをシーンに配置して動作を確認しました。
結果は以下の通り、継承クラスからアクセス可能なスコープである場合のみ呼び出されます。
・privateの場合:継承元のライフサイクル関数が呼び出されない
・protectedの場合:継承元のライフサイクル関数が呼び出される
base参照
当然ながら base.Start() など継承クラスで継承元の関数を参照したい場合もアクセス可能なスコープである場合のみ参照可能です。
privateの場合
・Meat.cs
using UnityEngine; namespace LifeCycle { public class Meat : Food { void Start() { Debug.Log("Meat Behaviour"); // 参照不可 //base.Start(); } }
protectedの場合
・Ball.cs
using UnityEngine; namespace LifeCycle { public class Ball : Toy { void Start() { Debug.Log("Ball Behaviour"); base.Start(); } } }
参照元に指定のライフサイクル関数がない場合はこちらもアクセスできないため、コードでエラーが発生します。
・Character.cs
using UnityEngine; namespace LifeCycle { public class Character : MonoBehaviour { } }
・HoloMon.cs
using UnityEngine; namespace LifeCycle { public class HoloMon : Character { void Start() { Debug.Log("HoloMon Behaviour"); // 参照不可 //base.Start(); } } }