【継承とは】基底クラス(Virtual Class)の使い方

親クラスと子クラス
継承に関して
スライムやドラゴン、ゴブリンなどの複数のモンスターがいる場合。共通の変数、関数で修正があるとスクリプトを一つ一つ直さなければいけない。
そこでモンスターという「親クラス」を作成し、そこからスライム、ドラゴンの「子クラス」を作成するとまとめて修正できる。
親クラスMonsterを作成し、MonoBehaviourを継承させる。
子クラスはMonsterを継承させる。MonoBehaviourは親のMonsterで継承されているため子にも受け継がれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; /// <summary> /// Monsterクラス /// </summary> public class Monster : MonoBehaviour { // 攻撃力 protected int _attack; // 体力 protected int _hp; // スピード protected float _speed; // Rigidbody protected Rigidbody _rigidbody; protected virtual void Start() { // 自動的にRigidbodyを取得 _rigidbody = GetComponent<Rigidbody>(); } } |
アクセス修飾子をprotectedにすることで、子クラスでそのまま使用できる。
protectedにするとこのクラスを継承した子クラスでのみアクセスできる。pubulicでも動くが他のクラスからアクセスできてしまう。
こうすると子クラスで同じ関数や変数を宣言する必要がなくなる。
1 2 3 4 5 6 7 8 |
using UnityEngine; /// <summary> /// Monsterクラスのドラゴン /// </summary> public class Dragon : Monster { } |
Start関数の再定義
Start関数を親クラスで定義し、子クラスでも定義した場合はエラーが起きる。
この場合 親のアクセス修飾子の横に「virtual」を付け、子は「override」を付ける。
こうすると親と子どちらのStartも呼ばれる。
①親
変更前: protected void Start()
変更後: protected virtual void Start()
②子
変更前:protected void Start()
変更後:protected override void Start()
※「new」を付けることで親クラスのStart関数を無視することもできる。
protected new void Start()
実行順の指定
親クラスのStart関数 >> 子クラスのStart関数 としたいときは、
子のStart関数にbase.Start();を付けると親から実行される。
1 2 3 4 5 |
protected override void Start() { base.Start(); _constraint = _rigidbody.constraints; } |