見出し画像

Unityでドンキーコングリターンズのロケットバレルを作ってみる ~その9~

前回の更新からだいぶゲームらしくなってきましたね。
一通り遊べるようになったところでいよいよコースを生成するプログラムを組んでいきたいと思います。


■Chapter19 〜一定間隔でアイテム(コイン)を自動生成するプログラムを作ってみる~

それではいよいよアクションゲームの肝でもあるコース制作に入っていきます!
実装初期は敵キャラの蜂をランダムな位置に出現させ、避けながら進むバルーントリップのような感じをイメージして作っていましたが、フラッピーバードのように障害物を潜り抜ける方が面白そうだなと思い作り直しました。

とはいってもただ単に進むだけだと味気ないので追加要素としてコインを出す予定で、前回のゲーム「Kenji Run」のエンドレスモードと同じくゲームオーバーになった際に進んだ距離と集めたコインの合算値がハイスコアとして登録されるようにしたいと思います!

スーパーマリオRPGの沈没船のミニゲーム部屋のような感じで、まずはコインを出現させるための大本のオブジェクトを作成し、そのオブジェクトが一定の距離まで進んだらアイテムのコインを出現させるという感じで作っていきたいと思います。🪙🪙🪙 🏃‍♂️💨

一定距離数毎にアイテムを自動生成するプログラムの組み方は色々あると思いますが、自分は👆のような感じで手っ取り早く作れそうな「コライダー」を使うことにしました!

コインを出現させるための大本のオブジェクト「CoinAppear」をメインカメラの子オブジェクトとして作成し、画面から見えない位置に配置します。

次点でCoinAppearとの接触を判定するオブジェクト「CoinAppear Collider」を作成しCoinAppearの右隣に配置させ、両方とも「Box Collider 2D」を忘れずにアタッチしてください。

次にCoinAppearオブジェクトを動かすスクリプトの作成です。

22行目でCoinAppearオブジェクトとColliderオブジェクトが接触した際にプレハブであるアイテムのコインを配置し、ついでに28行目にて指定された座標分移動させてくれる「Translate」を使ってコライダーを奥へ移動させるだけで簡単に実装することができます。

尚、26行目でコイン出現と同時に予め作成したゲームオブジェクトの子オブジェクトのなるように指定しておりますが、こうすることでHierarchyがClone尽くしになることを防ぐことができるため、少々面倒でもやっておくに越したことはありません。

空のGame Objectはフォルダの代わりにもなるのでうまく活用するととても便利です。
マップオブジェクトとして配置しておき、アイテム類などは一括で管理できるようにしておきましょう!

■Chapter20 〜カメラ外に出たオブジェクトを削除する~

次はオブジェクトの削除処理です。

昔のゲームなんかで敵キャラやアイテムなどのオブジェクトが画面いっぱいに出現しまくったときなんかに動きがスローモーションになることがしばしばありましたが、あれはオブジェクト一つ一つに判定があり、それを毎フレーム毎に読み取っているため、沢山出現することによってプログラムの処理が追い付かなくなってしまい、最初は微量だったものが次第にプレイヤーにも分かるくらいに処理が重くなってしまうというわけですね。

単なる背景など自身がアクションを起こさないオブジェクトであれば多少多く出してもそうそう処理が重くなることはないのですが、当たり判定のあるオブジェクトは「アイテム」→「敵キャラ」→「プレイヤーキャラ」の順番で処理に負担がかかってくるので、特に今回のような一方通行タイプのゲームでは画面外に出たオブジェクトは速やかに削除するに越したことはありません。

以下のスクリプト「ObjectDestroyScript」を作成し、コインにアタッチすることでカメラ外に出たオブジェクトを削除させることができます。

コードの解説は不要かと思いますが、19行目の「メインカメラ.position.x」の後の「- 24.0」はカメラの大きさに合わせて調整する必要がある点にだけご注意ください。
プレハブのコインの方に「ObjectDestroyScript」をアタッチすることでゲーム中に出現するすべてのコインにスクリプトが適用されるようになります。
Destroyを使用したことによりカメラ外のオブジェクトから順番に削除されるようになった。
ちなみに本来であればこういったコインのような何度も出現するオブジェクトの場合はただ単に削除するのではなく、オブジェクトプールを使用し使いまわすのが理想らしいのですが、今回はカンタンなゲームということもありそこまでしなくても大丈夫だと思うので逃げ割愛します。

■Chapter21 〜プレハブの座標を修正する~

コインの出現及び削除処理は完了したものの、今の状態だと👇のようにコインのX座標が少しズレて出現してしまうためキッチリと固定していきます。

とはいっても微量なズレですのでこのまま出しても特に問題ないと思いますが、スーパーマリオが世界的に愛されているのもジャンプの高さから当たり判定まで本当に丁寧に作りこまれているからだと思いますので、やっぱりちゃんとしたゲームを作るために整数単位で配置されるようにしておくに越したことはないでしょう。

スクリプトの編集は至って簡単で最初に作成した「CoinAppearScript」を開き、👆のような感じで25行目のpositionの第1引数にMath.ceil関数を追加するだけです。

Math.ceil関数は必ず整数の値を返してくれるため、今回のようにスクリプトの座標修正なんかに非常に役立ちます。
プレイヤーキャラが地面に立ってる時なんかもそうですが、僅か1ドットの座標のズレでジャンプの高さも変わってしまいますので、本格的なアクションゲームを作られる場合は必ずプレイヤーの立ち位置は固定しておきましょう!

Math.ceilを使用したことで整数単位でキッチリとオブジェクトが配置されるようになった。
尚、今回自分がやったようにオブジェクト同士の接触をきっかけにプレハブを出現させる場合、オブジェクト同士の大きさや位置によってはマス単位でズレが生じることがあるため、
上記スクリプト25行目のように「transform.position.x」の後に追加で値を代入したりして各自で工夫してみてください。

以上が今回の内容となります、毎度ながらここまで読んでくださりありがとうございました。

次回はランダムでコインの配置を変えたりしてみたいと思います👍


いいなと思ったら応援しよう!