はじめに
こんにちは。ShrineGate3544です。
今回はUnityにおけるクラスの継承についての説明をします。
前回はクラスとインスタンスの解説をしました。
そこから派生して、「クラスの継承」というものを説明します。
なお、クラスの基本事項をある程度理解している方を対象として想定しています。「クラスって何?」という方は、前回の記事を見たりインターネット等で検索したりすることをお勧めします。
継承とは?
前回、クラスは「共通の設計図」だと説明しました。
Enemyクラスを作っておけば、ゴブリンやドラゴンなどそれぞれの敵キャラを簡単に実装することができます。
しかし、もし「ボス敵」のように特別な行動をするキャラを作りたい場合、また1からBossクラスを書くのは面倒ですよね。
そんなときに便利なのが、継承 です。
継承のイメージ
継承とは、あるクラス(親クラス)をもとにして、それを受け継いだ新しいクラス(子クラス)を作ること です。
つまり、「親クラスの機能を引き継いで、追加で機能をちょっと付け足す」という仕組みです。
親クラスの変数や関数は、基本的に子クラスでも使用することができます。
この際、新しく宣言する必要はありません。
親クラスの関数の一部を変更したい場合は、特殊な書き方をする必要があります。
以下で具体的な書き方を見ていきましょう。
継承の書き方
前回、以下のようなEnemyクラスを例として挙げました。
今回もこちらを利用していきます。
(説明の都合上、一部を変更しています。理由は後から説明します。)
public class Enemy : MonoBehaviour //Enemyクラスの定義
{
public string Name;
public int HP;
public int Attack;
public virtual void ShowStatus() // <-ここに「virtual」を追加しました
{
Debug.Log(Name + " のHPは " + HP + " です。");
}
}
今回は、このEnemyクラスを基にした子クラスを作成しましょう。
以下のように書くことができます。
public class Boss : Enemy // <- Enemyクラスを継承しているときの表記
{
Name = "ボス";
HP = 500000;
public int MP = 100;
public override void ShowStatus()
{
base.ShowStatus();
Debug.Log(Name + "はとても強い。");
}
}
それぞれの書き方のポイントを詳しく見ていきましょう。
子クラスを宣言
子クラスを宣言する際は、以下のように書きます。
public class Boss : Enemy //「Enemy」は親クラス名、「Boss」は子クラス名
普通のクラスと異なる点は、「:」のあとに継承したい親クラスの名前を書くことです。
これで、子クラスを宣言することができます。
変数を宣言
上の例で言うと
Name = "ボス";
HP = 500000;
public int MP = 100;
が変数に関係する部分です。
子クラスでは、基本的に親クラスの変数をそのまま使用できます。
この例だと、「Name」と「HP」はEnemyクラスで宣言されたものです。そのため、子クラスではこの記述のみで数値の変更が可能です。
なお、親クラスと子クラスの変数は連携しているわけではありません。子クラスで変数の値を変更しても、親クラスの変数は変化しません。
子クラス内で新たに変数を宣言する場合は、通常どおりの書き方をします。
「MP」がこれに相当しています。
なお、親クラスで宣言した変数を子クラスで変更しない場合、親クラスの値がそのまま引き継がれます。
関数のオーバーライド
関数の動作の一部を変更することをオーバーライドといいます。
オーバーライドには、親クラスと子クラス双方の特殊な記述が必要です。
オーバーライドの書き方
・親クラス
関数定義時に、「virtual」と書く必要があります。
public virtual void ShowStatus() // このように「virtual」が必要
これでオーバーライドの下準備ができます。
・子クラス
関数定義時に、「override」と書く必要があります。
public override void ShowStatus() // このように「override」が必要
上記ように記述することで、親クラスの関数から一部を変更した関数を作成することができます。
baseキーワード
子クラス内でbaseキーワードを使用すると、親クラスの変数や関数にアクセスすることができます。
baseキーワードを使用する際は以下のように記述します。
base.A = 100; // <- 「A」は親クラスで定義された変数
base.func(); // <- 「func」は親クラスで定義された関数
一例
先程のBossクラスでは、以下のようにオーバーライドしていました。
public virtual void ShowStatus()
{
Debug.Log(Name + " のHPは " + HP + " です。");
}
public override void ShowStatus()
{
base.ShowStatus();
Debug.Log(Name + "はとても強い。");
}
上の関数を実行すると
「(キャラの名前) のHPは (キャラのHP) です。」
というログが出力されます。
一方、オーバーライドで内容を変更した下の関数を実行してみるとどうでしょうか。
baseキーワードを使用しているため、
「ボスのHPは500000です。
ボスはとても強い。」
と出力されます。
オーバーライドを用いることで、このように親クラスの関数を拡張することができます、
まとめ
今回は、クラスの継承について解説しました。
ゲームを作るうえでは欠かせない機能ですので、理解できれば大きな力になりますよ!