i-school - 強制横スクロールゲーム 手順12
 以下の内容で順番に実装を進めていきます。

手順12 ーゲームオブジェクトの自動生成処理の実装ー
19.空中床のゲームオブジェクトをプレファブにして、自動生成の準備をする
20.スクリプトを作成し、一定時間おきに空中床をランダムな位置に自動生成する処理を追加する

<実行動画>
https://gyazo.com/b26f6238541b0dbdbddf8e513fabe861


<実行動画>
https://gyazo.com/c37df881a6eb358c9a0b30032c91c2c1



新しく学習する内容


・無制限の強制スクロールの実装


19.空中床のゲームオブジェクトをプレファブにして、自動生成の準備をする

設計


 次の手順でスクリプトを使って空中床のゲームオブジェクトを自動生成するため、ここではその事前の準備を行います。

 まずは空中床のゲームオブジェクトをプレファブにします。このプレファブを元にして、スクリプトから空中床のゲームオブジェクトのクローンを生成します。

 クローンのゲームオブジェクトを生成する際には生成位置の情報が必要になります。今回はゲーム画面内の固定の場所から生成するようにしますので
新しいゲームオブジェクトを作成して、その位置情報を生成位置として利用します。キャラのバルーンを生成する際と同じ手法になります。


AerialFloor_Mid ゲームオブジェクトをプレファブにする


 ヒエラルキーにある AerialFloor_Mid ゲームオブジェクトを選択し、Prefabs フォルダへドラッグアンドドロップしてプレファブにしてください。
ヒエラルキー上の AerialFloor_Mid ゲームオブジェクトのアイコンと文字が青い色に変わればプレファブになっています。


プレファブ後の AerialFloor_Mid ゲームオブジェクト ヒエラルキー画像



Prefabs フォルダ画像



 プレファブにしたら、ヒエラルキー上の AerialFloor_Mid ゲームオブジェクトは不要ですので、ヒエラルキーから削除してください。


プレファブにした AerialFloor_Mid ゲームオブジェクトの位置情報の修正を行う


 Prefabs フォルダにある AerialFloor_Mid ゲームオブジェクトを選択して、インスペクターの一番上にある Open Prefab ボタンを押して編集モードにします。

 Transform コンポーネントの Position の情報をすべて (0, 0, 0)に設定してください。この値が 0 以外の値になっていると生成された際にもこの値が反映されるため
予期していない位置での生成を行うことになります。子オブジェクトの位置はそのままで問題ありません。


<手順動画 プレファブ後は位置情報をリセットしておく>
https://gyazo.com/d807c97b5eec17c7b59515ab03d754db


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



GenerateTran ゲームオブジェクトを作成する


 ヒエラルキー上で右クリックをしてメニューを開き、Create Empty を選択して、作成されたゲームオブジェクトの名前を GenerateTran に変更します。
このゲームオブジェクトが、先ほどプレファブにした空中床のゲームオブジェクトを生成する位置になります。


GenerateTran ゲームオブジェクト ヒエラルキー画像



 Sceneビュー画像とインスペクター画像を参考に、画面の右端中央辺りにこのゲームオブジェクトを設置してください。

 Transform コンポーネントしか持たないゲームオブジェクトはSceneビューでもGameビューでも視認できません。
そのようなときには、ラベル機能を利用します。

 ラベルを設定するゲームオブジェクトのインスペクターから、名前の横にあるアイコンを左クリックしてください。
色を選択できますので、それを選択すると、その色とゲームオブジェクトの名前を持ったラベルが作成されて、Sceneビューのゲームオブジェクト上に表示されます。


ラベルの場所(インスペクターのオブジェクト名の左側のアイコン。ラベルを設定すると画像のように設定した色に変わる)



<手順動画 見えないゲームオブジェクトにラベルを設定する>
https://gyazo.com/e5c645bee59e9601d2940a17bef9221e


 このラベルを利用してもGameビューには見えるようにはなりませんので、もしも確実に場所を視認したいのであれば
この GenerateTran ゲームオブジェクトに SpriteRenderer コンポーネントを追加して、適当な画像を設定して、それを参考に設定してください。
その場合、設定が終了したら、忘れずに Remove Compnent しておいてください。


GenerateTran ゲームオブジェクト SceneビューとGameビュー画像



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



 以上で事前準備は完了です。


20.スクリプトを作成し、一定時間おきに空中床をランダムな位置に自動生成する処理を追加する

設計


 プレファブを元にクローンを作成するためのスクリプトを作成して、プレファブにした空中床のゲームオブジェクトを自動生成出来るようにします。

 自動生成のタイミングですが、色々な方法が考えられます。例えば、ゲームの背景画像のスクロールする距離を計測しておいて、その距離が一定値を超えたら、などです。

 今回は生成までの待機時間を設定し、待機時間になるまでの時間をゲーム内で計測します。待機時間を経過したら空中床を生成して、再度、計測を行うようにします。
そして待機時間が経過する度に空中床を生成するようなロジックにします。生成回数に制限はありませんので、この処理を実装すると無限に繰り返す生成処理を実装出来ます。

 空中床を生成する位置は先ほどの GenerateTran の位置で設定を行いましたので、この情報をスクリプト内で参照して利用します。
ただし毎回同じ位置に生成していたのではゲームにならなくなってしまいます。生成するたびに高さ(Position.y)の情報にランダム性を与えて
生成ごとに空中床が生成される高さを変えるようにして制御を行います。こういったゲームならではのランダム性を楽しむための要素として上手く盛り込んでいきましょう。


<完成動画>
https://gyazo.com/cb8090b6b2c902ddf9d4f08c632380f0


FloorGenerator スクリプトを作成する



FloorGenerator.cs

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



GameManager ゲームオブジェクトを作成し、FloorGenerator スクリプトをアタッチする


 ヒエラルキー上で右クリックをしてメニューを開き、Create Empty を選択して、作成されたゲームオブジェクトの名前を GameManager に変更します。
GameManager ゲームオブジェクトに、作成した FloorGenerator スクリプトをドラッグアンドドロップしてアタッチします。


GameManager ゲームオブジェクト ヒエラルキー画像



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



 GameManager ゲームオブジェクトを選択してインスペクターを確認します。
FloorGenerator スクリプト内にアサイン情報が3つ表示されますので、順番に設定します。


 aerialFloorPrefab 変数には、Instantiateメソッドで生成するゲームオブジェクトのクローン元である、空中床のゲームオブジェクトのプレファブを設定します。
プレファブにした AerialFloor_Mid ゲームオブジェクトを Prefabs フォルダで選択し、ドラッグアンドドロップしてアサインします。

 generateTran 変数には、Instantiateメソッドでクローンのゲームオブジェクトを生成する位置の設定します。
先ほどの手順で作成した GenerateTran ゲームオブジェクトをドラッグアンドドロップしてアサインしてください。
Transform コンポーネントが情報として代入されます。

 waitTime 変数には、1つの空中床を生成するまでの待機時間を設定します。待機時間があまり短くても床がたくさんあふれて混雑してしまいますし、
逆に待機時間を長くすると空中床が生成されない時間が増えます。この辺りは適宜な値を調整しながら設定していきましょう。

 まずは最初はデバッグを行う必要がありますので、3 秒程度の短い時間に設定しておいて、自動生成が行われるかを確認してから調整します。
デバッグ終了後の規定値としては 6 〜 8 秒位を考えていますので、その間位で設定をして、調整を行ってみてください。


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



 以上で設定は完了です。


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


 ゲームを実行して、自動生成が行われるかを確認しましょう。
WaitTime 変数の時間を 3 に設定しているので、3秒おきに空中床のプレファブのクローンであるゲームオブジェクトが
ランダムな高さに調整されて生成が行われるようになっていれば成功です。


SceneビューとGameビュー画像



<実行動画>
https://gyazo.com/b26f6238541b0dbdbddf8e513fabe861


<実行動画>
https://gyazo.com/c37df881a6eb358c9a0b30032c91c2c1


 無事に動作していたら WaitTime 変数の値を操作して、どのように自動生成の処理が変化するかを確認してみてください。


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

 次は 手順13 −スタート地点の移動処理− です。