i-school - 3Dダイビングゲーム 発展6

ー障害物とアイテムの自動生成の実装ー


 この手順では作成してある障害物とアイテムをゲームの実行に合わせて、ランダムな位置と数で自動的に生成して設置する処理を実装します。

 ・障害物とアイテムの自動生成を追加する


<実装動画 ゴール地点以外をすべてランダムで生成する>
https://gyazo.com/dabd9507863afbbd589e0b3de2584bc1



 新しい学習内容は、以下の通りです。

 ・自分で自動生成を考えて実装してみる


1.設計


 花輪のゲームオブジェクトの自動生成処理を参考に、GameManager スクリプトに障害物とアイテムを自動生成する処理のロジックを自分なりに考えて実装してみましょう

 それぞれの自動生成処理に分けてもいいですし、ランダムでどちらかを生成するようにしてもいいです。

 機能として実装を行いたいため、花輪の自動生成のように、インスペクターからスイッチで利用する、しないを設定できるようにしてください。
そして利用する場合にのみ、障害物とアイテムを自動生成するように制御をしてください。

 制御に必要な変数を用意し、それを使ってどのような制御を行うのかをロジックを組んでみてプログラムを書いてみましょう。


2.GameManager スクリプトの修正を行い、障害物とアイテムの自動生成処理を追加する


 ここでの実装例は、配列変数を用意し、その中に障害物とアイテムを一緒に登録し、そのいずれかから1つをランダムで選択して生成する処理を実装しています。
他の処理でも構いませんので、自分の実装を試してみてください。

 宣言フィールドに GameObject 型の配列変数を用意します。SerializeField属性で宣言しておくことで、インスペクターより値の登録が可能になります。
こちらに、プレファブになっている障害物とアイテムのゲームオブジェクトを登録し、ゲーム内で生成するようにします。

 新しいメソッドとして CreateRandomObjects メソッドを追加します。こちらのメソッドの呼び出しを Start メソッドに追加します。
自動生成処理は機能の1つとして追加するため、利用するかしないかを選択できるように bool 型の変数を用意し、利用する場合のみ true に設定することで
Start メソッド内で処理を分岐して制御します。


GameManager.cs(自分で作成しているスクリプトがある場合には、そのスクリプトを修正する)

 <= クリックすると開きます



 スクリプトの修正が終了したら、GameManager ゲームオブジェクトのインスペクターより、GameManager スクリプトを確認してください。
新しく宣言して追加した変数が表示されていれば問題ありません。


GameManager ゲームオブジェクト インスペクター画像



3.GameManager ゲームオブジェクトの設定を行う


 自動生成機能をデバッグするために、isRandomObjects 変数にチェックを入れてオンの状態(true)にします。

 randomObjPrefabs 変数は GameObject 型の配列になっていますので、ゲームオブジェクトであればどれでも登録できます。
ここでは、ゲームの障害物とアイテムを登録したいので、Prefabs フォルダ内にある、ObstacleFlower ゲームオブジェクトと
Trampoline ゲームオブジェクトを順番にドラッグアンドドロップしてアサインしてください。


GameManager ゲームオブジェクト インスペクター画像



 以上で設定は完了です。


4.ゲームを実行して動作を確認する


 すでに障害物とアイテムをゲーム内に設置してあると思いますので、それらを管理しているフォルダを非表示にします。
そうすることで子オブジェクトになっている障害物とアイテムはすべて非表示になります。(1つずつ設置していると、こういったまとめて何かをする作業の際に大変になります。)

 また Ways ゲームオブジェクトも一緒に非表示にしておきます。これでゲーム内には、ゴール地点以外の花輪と障害物とアイテムがなくなります。
その状態にしてから、ゲームを実行しましょう。どの位、障害物とアイテムが出来るのか、ゲームとしてのバランスはどうなのか、確認を行うことが出来ます。


<実装動画 ゴール地点以外をすべてランダムで生成する>
https://gyazo.com/dabd9507863afbbd589e0b3de2584bc1


 もしも花輪、障害物アイテムが少ないようであれば、それぞれの生成までの間隔を短くしてみましょう。
どの部分を操作すればいいか、自分で確認しながら設定を行ってください。
間隔は実数で指定していますので、変数化して、インスペクターから設定できるようにしてもいいでしょう


 以上でこの手順は終了です。