C#でプログラムを組む上で避けて通れないのが 継承 ですが、Unity特有のMonoBehaviourクラスの派生クラスを さらに継承 してクラスを作成することができます。
Start関数やUpdate関数をオーバーライド することで、基本処理を共通化することが可能です。
基底クラスを作る
まず基底クラスを下のように定義します。
public class BaseBehaviour : MonoBehaviour { virtual protected void Start () { } virtual protected void Update () { } }
MonoBehaviour のメソッドに、以下二つ修飾子をつけています。
- virutal 修飾子をつける
- protected か public にする
派生クラスを作る
派生クラスは以下。
public class ChildBehaviour : BaseBehaviour { // 基底クラスを自作クラスに override protected void Start () { base.Start(); // 親クラスのメソッドを呼ぶ } override protected void Update () { base.Update(); // 親クラスのメソッドを呼ぶ } }
- 継承元に、作成した基底クラスを指定
- メソッドに override 修飾子をつける
- protected か public にする
- base.xxxx() として親クラスのメソッドを呼び出す
あとはChildBehaviourをGameObjectにアタッチすれば、Unity のメソッド呼び出しに沿った順番で親クラス子クラス両方のメソッドが呼ばれます。
あまり乱用しないほうが身のため
少なくとも、Unityでのゲーム開発とオブジェクト指向は相性が悪いんじゃないか、使うにしても一部にとどめたほうがいいのではないか というのが、現時点での私の感想です。
たとえば、やりがちなケースで、敵の基底クラスを Enemyクラス として、すべてそのクラスから派生させようとすると、大体後で対処しづらいケースが出てきます。
そういう場合の一つの解としては、Enemy スクリプトと、敵単体の特徴をまとめたスクリプトの二つを付加 してしまったほうが管理が楽な場合が多いです。
UnityのGameObjectは コンポーネントの集まり という形になっているので、こちらのほうが自然なのかもしれません。
ただやはり、継承が便利な場合が多々あるのも事実なので、要は使うところ選びましょうねってことです。