今回は、ユニティちゃんが走っているステージを自動生成したいと思います。
現状では縦長のステージを1つ配置しているだけなので、生成時に負荷がかかってしまいます。
そこで、マップチップのように形状を変更したものを複数用意して、キャラクターが一定の距離進んだら新しいステージを自動的に生成するようにします。
ステージの生成を自動化することで、作業効率も上がりますし、生成するパターンもランダムにすることが出来るので、長いステージを作成する際にオススメの手法です。
自動生成するステージの作り方
ゲーム開始時に生成される初期ステージは固定にしておきます。敵の出現するタイミングをコントロール出来るようにするためですね。
Cubeを使って初期ステージを作成
Terrainのコピーは何かと苦労することがあるので、使い勝手の良いCubeを使って初期に表示されるステージを作ります。
PositionZの値を10にしてScaleは(5,0.1,20)にします。ちなみに、ユニティちゃんのPositionは(0,0,1)にしています。
名前をStage1と変更したら、プレハブ化しておきましょう。
ステージを自動生成するスクリプトを作成する
新規スクリプト「AutoStage」を作成します。
ユニティちゃんが一定の距離進んだら、先ほど作ったCubeを生成してステージを繋いでいくことで、ずっと走り続ける事が可能になります。
各ステージにインデックスを指定して、ステージの管理を行うようにします。
イメージにするとこういった感じですね。通り過ぎて不要になったステージも生成と同時に削除するようにします。これらを踏まえてスクリプトを作ります。
ゲームが始まると、この後指定するステージ数に応じてステージを生成します。
Cube1つ分のScaleZは20にしているので、StageSizeを20に設定しています。
Updateメソッド内で、ユニティちゃんがCube1個分(20)進んだらステージの更新処理を呼び出して、指定されたインデックス位置までステージの生成を行います。
生成したら、Add関数にてリストに追加して管理しているステージの上限数を超えていたら古いステージを削除します。RemoveAt関数は、指定した位置の要素を取り除いて、その後ろに並んでいる要素を詰めることが出来ます。
今はステージの種類が1種類しかないので、同じステージを繋ぎ合わせるだけですが、違うステージを作ってそれぞれプレハブ化し、ランダムでステージの種類を決めるようになります。
スクリプトを保存したら、空のオブジェクト「StageGenerator」を作ってアタッチしましょう。
Targetにユニティちゃんを設定します。
Stagenumのサイズを「1」にしてCubeプレハブをElement 0に設定します。
First Stage Indexには「1」を入力します。これは、最初に配置されているステージがインデックス0に対応しているので、その先から自動生成させるためです。
Ahead Stageは「3」にして3つ分先までステージを生成するようにします。
Stage Listはサイズを「1」にしてシーン上に配置しているCubeをElement 0に設定します。
ここまで設定出来たらゲームを実行してみましょう。
ユニティちゃんの移動に合わせて、ステージの生成と削除が同時に行われていますね。