i-school - 親クラスを継承させたアイテムクラスを作成する

手順


 以下の手順に沿って実装を進めていきます。

1.enum(列挙型)を使ってゲームに登場するアイテムの種類とプレイヤーのコンディションの種類を登録する
2.アイテム用クラスの親クラスを設計して実装する
3.親クラスを継承した回復アイテム用の子クラスを設計して実装する
4.汎用的な扱いが可能なアイテム用のプレファブを新しく作成する
5.親クラスと子クラスのメソッド処理について(多態性)

1.enum(列挙型)を使ってゲームに登場するアイテムの種類とプレイヤーのコンディションの種類を登録する


 事前の準備としまして、enumを使ってゲームに登場するアイテムの種類とプレイヤーのコンディションの種類を登録しておきましょう。

ITEM_TYPE.cs

<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。


CONDITION_TYPE.cs

<= +ボタンを押すと開きます。自分のプロジェクトに合わせてプレイヤーのコンディションの種類を登録しておきます。


 どちらもMonoBehaviourクラスの継承はありません。そのため、いずれのクラスからでも参照が可能です。

2.アイテム用クラスの親クラスを設計して実装する

 親となるクラスはMonobehaviourを継承したクラスになります。これがすべてのアイテムの親となるクラスになります。
親クラスは通常通り、新しいC#スクリプトを作成していく手順で作っていきます。

 子クラスでのみ実装が必要な情報と、親クラスに実装して子クラスで共通化する情報とがありますので
まずはその切り分けを行って、共通化できるもののみを親クラスに用意します。

 親クラスに用意するのは変数と関数になります。

 その場合、修飾子にはprotectedを使用します。これは親子間でのみ使用できることを許可する修飾子です。
またメソッドの場合にはそのあとにvirtualを記述します。こうすることで親クラスのメソッドとして成立します。

 外部で利用したい場合には通常通りpublic修飾子を使用します。

 親クラスで設定された修飾子の情報は子クラスでも引き継がれます。
例えば親クラスで public float x を作成していれば、それは子クラスでも public float x として扱われます。

ItemBase.cs

<= +ボタンを押すと開きます。親クラスとして共有化する情報はプロジェクトにより異なります。自分のプロジェクトに合ったものにアレンジしましょう。


3.親クラスを継承した回復アイテム用の子クラスを設計して実装する


 前回作成したItemRecoverクラスに、MonoBehaviourの代わりにItemBaseを継承させます。
これによって親クラスItemBase、子クラスItemRecoverという関連性が生まれます。

 なお、ゲームオブジェクトにアタッチするのは子クラス(ここではItemRecover)のみで大丈夫です。
 
 以下はItemRecoverを修正したスクリプトになります。

<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。


 子クラスの処理はこれだけです。他の必要な処理はすべて親クラスに記載されていますので、そちらで処理を行ってくれます。
そのため子クラスには、親クラスに足りない情報や、親クラスのメソッド内容に対して修正したい処理だけを記述すれば大丈夫です。

 子クラスにおいて親クラスのメソッドに変更を加えた場合、親クラスの処理は無視されます。これをオーバーライドといいます。
もしも親クラスのメソッドの処理に加えて、子クラスの処理を追加したい場合には、メソッド内に base.メソッド名(); を記述します。
詳しい使い方については長くなってしまうため別のページで行いますが、まずはご自分で継承について調べてみましょう。


 プレファブになっている回復用ゲームオブジェクトItemRecoverPrefabに、修正したItemRecoverクラスをアタッチします。
インスペクター上には継承している親の情報も表示されます。忘れずに設定を行いましょう。


回復アイテム用のマテリアルを作成する




 おなじような手順で、他のアイテム用クラスも修正し、親子関係を持つ作りに変更してみましょう。





4.アイテムの生成方法を修正する


 EnemyControllerスクリプトにある、アイテムの生成処理について修正を加えていきます。

 まずいままで回復アイテム用プレファブを登録していた宣言を、配列に変更します。その際、ItemBaseの配列に宣言を変えます。
ここにItemBaseを親クラスとして持つ各アイテムのプレファブをインスペクター上で登録しておきます。
登録されたアイテムのプレファブの中から1つがランダムで生成されるようになります。
 
EnemyController.cs

<= クリックすると開きます。宣言フィールドと修正したメソッドのみを記載してあります。


5.ItemBaseを利用した生成について


 まずアイテム生成時の手順が少し変わりました。以前は回復アイテム用のプレファブ(ItemRecoverクラス)を指定して、そのまま回復アイテムを生成していました。
ですがこの処理ですと、他のアイテムを生成するためには、アイテムごとに生成処理を変えなくてはならず、同じような処理であるのに冗長的な処理を増やしてしまいます。

 そこで今回はItemBaseクラスを指定して、アイテムを生成しています。
 生成されるゲームオブジェクトはItemBaseクラス型の配列に登録されているプレファブのゲームオブジェクトになっています。

 そのため、ItemBaseを指定して生成を行うのですが、実際には、そのItemBaseを継承している子クラスが生成されるゲームオブジェクトとなるため
異なるゲームオブジェクトを生成する処理にもかかわわず、同じ処理を書く必要がないうえ、生成されるアイテムを自動的に変えることが出来ます。


 アイテム取得時にはPraparateItemEffectメソッドをPlayerControllerより呼び出します。
このメソッドを経由して、TriggerItemEffectメソッドが呼ばれて、子クラスでオーバーライドして実装した処理が行われます。