多態性(ポリモーフィズム)とは、 同じメソッドの呼び出し命令に対して、
異なるオブジェクトが異なる動作をする(振る舞いを変える)ことを言います。
オブジェクト指向プログラミングのプログラミングにおける、重要な考え方・概念になります。
++C++; // 未確認飛行 C 様
C# によるプログラミング入門 多態性
https://ufcpp.net/study/csharp/oo_polymorphism.htm...
今回の実装のケースであれば、ItemBase クラスに用意されている TriggerItem メソッドを実行する際に、
回復アイテムであれば回復アイテムとしての処理を行い、速度アップのアイテムであれば速度アップとしての処理を行うように、
同じメソッドであるにもかかわらず実行される処理が異なるー振る舞いを変えるーことを指しています。
仮にクラスの継承がなく、メソッドのオーバーライド処理もない場合と、今回実装している処理とを比較してみます。
ゲームオブジェクトを判定するにあたり、タグを利用したケースで考えてみます。
<タグを利用して複数のゲームオブジェクトを判定する場合>
if(hit.collider.gameObject.tag == "Enemy_A" || hit.collider.gameObject.tag == "Enemy_B"){
// 敵のクラスを取得
EnemyController enemy = hit.collider.gameObject.GetComponent<EnemyController>();
// 敵のクラスにあるメソッドを実行
enemy.Damage();
}
else if(hit.collider.gameObject.tag == "Enemy_C"){
// 敵のクラスを取得
EnemyController_Boss boss = hit.collider.gameObject.GetComponent<EnemyController_Boss>();
// 敵のクラスにあるメソッドを実行
boss.BossDamage();
}
else if(hit.collider.gameObject.tag == "PowerUpItem"){
// パワーアップアイテムのクラスを取得
PowerUpItem powerUpItem = hit.collider.gameObject.GetComponent<PowerUpItem>();
// 敵のクラスにあるメソッドを実行
powerUpItem.PowerUp();
}
このように各ゲームオブジェクトが異なるクラスによって管理されている場合には、
各ゲームオブジェクトごとに分岐を作っています。
そして、
1つの新しい情報が増えるたびに分岐やタグを増やしていく必要があります。
各ゲームオブジェクトにアタッチされているクラスの情報も異なるため、
GetComponent メソッドで取得する型の指定や、その後のメソッドも書き替える必要があります。
数が少ないうちはいいですが、処理は煩雑になりがちですし、管理も修正も大変です。
共通のクラスを継承している場合には、分岐は必要ありません。
同じクラスを取得し、同じメソッドを実行すれば、
親クラス、あるいは子クラス内でオーバーライドされている処理が振る舞いを変えて、自動的に実行されるためです。
// ゲームオブジェクトにアタッチされている親クラスを取得できるか判定
if (other.TryGetComponent(out ItemBase item)) {
// 取得した親クラスにある抽象(仮想)メソッドを実行する => 子クラスで実装しているメソッドの振る舞いになる
item.TriggerItem(this);
}
非常に簡潔に処理を記述できる上に、ゲームオブジェクトの種類が増えてクラスが増えても、そのクラスが ItemBase クラスを継承していれば
ここに処理を書き足す必要もありません。
これが
クラスの継承とメソッドのオーバーライド処理によって振る舞いを変えることで実装できる大きな利点です。
この記述により、
今後アイテムの種類が増えても、CharaCotroller 側のアイテムの取得処理には追加の記述は不要になりました。
クラスの継承を理解するのは難しいですが、それだけの機能や恩恵が受けられることを考えると、是非習得していただきたい技術になります。
また、こういった処理を理解していくことでオブジェクト指向プログラミングにも慣れていくことが出来ます。
例えば、同じクラスの継承による機能を敵側にも用意することで、異なる敵からの攻撃判定を、別々の攻撃処理として振る舞いを変えることで実装が可能です。
繰り返し処理を考えて記述し、自分でもクラスを継承したクラスを自作してみてください。