i-school - アイテムを設計して実装する

アイテムを設計する

 アクションゲームだけに限らず、駆け引きを左右するようなパワーアップアイテムがランダムで出現したり、宝箱のようなボーナスアイテムが出現したりすると
ゲームのデザインが奥深くなります。
 
 一口にアイテムといっても様々な種類があると思いますので、まずはどのようなアイテムで、どのような意図があるのかを考えて
どのようにしたら出現するかなど、必要となる情報を元に設計を考えていきます。

 今回は、以下のようなアイテムを設計するようにします。

 ・敵を倒すことで、一定の確率で出現する。出現確率については敵側で設定できる。
 ・プレイヤーがアイテムに接触することで取得できる。
 ・敵はアイテムに接触しても取得できない。
 ・取得するとHPが回復する。回復値は割合ではなく実数値で、アイテム側で設定できる。
 ・出現している時間に制限はない。(取得するまで出現している。)
 これらの設計を踏まえて、プログラムを考えていきます。

クラスの継承を考えながら設計する

 今回のアイテムは回復効果を持つアイテムですが、今後、その種類を増やす場合を考えて、アイテム全体で使用する変数や関数については
親クラスを用意して、そちらに記述していくことを念頭に置いておきます。

 このような設計にしておくことにより、親クラスを継承した子クラスでは、例えば、回復アイテムであれば、回復の処理のみを記述することで
あとは親クラスの情報を継承するだけで作成が可能になります。

 またこのようなクラスの作りにしておくことで新たなアイテムを製作する場合にも、子クラスのみにそのアイテム独自の処理のみを実装すればよいことになります。
そうしないと各アイテムのクラス内にすべての処理を記述しなければなり、非常に冗長な処理を何度となく書いていくことになってしまい手間だけが増えてしまいます。

 とはいえ、まずは親クラスではなく、1つのクラス内にすべての処理を書いてみましょう。その中で、これはアイテムという処理においては
共通化できる処理になりそうだという部分が見えてきますので、その後、親クラスと子クラスに切り分けて処理を書き換えていくようにしましょう。

 作成していく手順ですが、以下の順番になります。

 1.回復アイテム用クラスを設計して作成する
 2.回復アイテム用ゲームオブジェクトを作成してプレファブ化する
 3.回復アイテムを一定確率で生成するようにする(敵を倒した場合)
 4.プレイヤーが回復アイテムを取得できるようにし、HPが回復する処理を行う

 上記の順番で作っていきます。

1.回復アイテム用のクラスを設計して作成する

 まずはクラスの継承は考えずに、1つのクラス内に回復アイテムとしての振る舞いが持てるように処理を設計して実装していきます。

 情報として用意したいものとしては「HPの回復量」です。こちらはPublicな変数として用意しておいて、インスペクター上から設定できるようにしましょう。

 アイテムとプレイヤーとの当たり判定はどちらに実装してもよいのですが、今回はプレイヤーのクラス内にあるOnTriggerEnterメソッドに追記して
アイテムの取得が可能なように変更をします。

 回復アイテム用クラスのスクリプトです。ItemRecoverクラスとします。

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

2.回復アイテム用ゲームオブジェクトを作成してプレファブ化する

 新しい3ⅮゲームオブジェクトとしてCubeを1つ作成します。名前をItemRecoverに変更しましょう。

 こちらに先ほど作成したItemRecoverのスクリプトをアタッチして、このゲームオブジェクトが回復アイテムとしての振る舞いを持てるようにしましょう。
インスペクターを確認し、アタッチが出来ていることを確認した上で、HP回復量に数字を入れておきましょう。0のままだとアイテムを取得しても回復しません。
(この例では目立つようにわざと0にしています。)

 Cubeを作成すると始めからBoxColliderがアタッチされていますので、こちらのIsTriggerにチェックを入れておきます。



 またそのままですと回復アイテムかどうか画面上でわかりませんので、新しいMaterialを1つ作成します。
そちらに回復アイテム用の画像などを設定して、Cubeが回復アイテムに見えるように変更しましょう。
作成したMaterialはMeshRendererのMaterialsの部分にアサインして使用できます。





 あとは画面上での見せ方ですが、例えば、ItemRecoverのScale.Zを小さくすると薄いパネルのようなアイテムになります。
こちらは適宜変更し、自分の考えているアイテムの形状にしていきましょう。(Cube以外のオブジェクトで作成しても問題ありません)

 最後にTagを設定します。まずはUnityに新しいTagを1つ追加します。Tagの名称はItemにします。
登録後、今後はItemRecoverのゲームオブジェクトにItemのTagを設定します。



 上記の手順がすべて完了すれば回復アイテムItemRecoverの完成です。
こちらをプレファブ化し、ヒエラルキー上にあるItemRecoverは削除しておきます。これで生成する準備も整いました。

3.回復アイテムを一定確率で出現(生成)するようにする(敵を倒した場合)

 アイテムの出現方法として、今回の設計では「敵を倒した場合」という条件によって生成されるように設計を考えました。

 敵が破壊される処理のあとに、この条件を入れればよいですから、EnemyControllerクラスに補記していくことが一番よさそうです。

 下記にEnemyControllerを補記したスクリプトを提示します。修正している部分のみ記載しています。

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

4.プレイヤーが回復アイテムを取得できるようにし、HPが回復する処理を行う

 プレイヤー側のOnTriggerEnterを修正することで、回復アイテムを取得できるようにしていきます。
回復アイテムのプレファブにはTagとしてItemを設定しておきました。そこで、当たり判定が発生した場合に
このItemのタグを持つゲームオブジェクトに接触したかどうかを判定することで、回復アイテムのゲームオブジェクトか、
そうではないゲームオブジェクトなのかを判別できるようにします。

 下記にPlayerControllerを補記したスクリプトを提示します。修正している部分のみ記載しています。

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


 以上になります。
 
 期待する挙動としては

1.敵を倒すと、アイテム出現確率で指定した確率で回復アイテムが敵の位置に生成される。
2.プレイヤーがアイテムを接触すると取得できる。取得できるとHPが回復する。最大値は超えて回復はしない。回復アイテムは破壊される。
3.敵はアイテムに接触しても取得できないので、アイテムは破壊されない。

 この動きになっていれば完成です。

次はこのアイテムクラスを親クラスと子クラスに分けてクラスを継承させた作りに変更していきます。