フラッピーバードをパクって再現してみようというこの企画。
前回はプレイヤーの動きと、追尾カメラを作成しました。
ステージを作る
プレイヤーの次はステージです。
本家では上下に土管状の障害物がぶらさがっており、画面の右から左に一定スピードでスライドしていきます。
障害物を作る
障害物の画像は、みんなだいすきいらすとやさんからお借りしました。
これは上位概念としての社会、それに従属する会社、そこをかいくぐる社畜(まるだしくん)という現実社会をモチーフにしています。(どうでもいい)
オブジェクトの構造としては下のようにします。
Obstacle が障害物のルートオブジェクト、UpperObstacleが上の障害物でLowerObstableが下の障害物です。 UpperObstacleもしくはLowerObstableにプレイヤーが衝突するとゲームオーバーになります。
Obstacleはプレハブ化しておきましょう。
これをあらかじめシーンに3つほど並べて配置しておきます。
ステージの仕様のキモ
最大の悩みどころは、プレイヤーを移動させるかステージを移動させるか ということです。
フラッピーバードは自動生成のステージなので、延々とゲームが続けば、シーンの限界位置まで移動してオーバーフローを起こしてしまうかもしれません。
ゲーム作りをしていると、こういった悩みに頻繁にぶつかると思います。 こういう場合の 無難な解決方法 として、 直感的に正しいほう を選びましょう。
フラッピーバードの場合、トリが土管の間をかいくぐっていくというモチーフのゲームです。 なので、トリが移動するほうが直感的に正しいと言えます。
これはなんとなく言っているわけではなく、ちゃんとした理由があります。
それはズバリ 物理エンジン の関係です。
ステージを動かしてしまう場合、トリの処理は トリを垂直に跳ねさせる ということになります。
そこで以下のような仕様変更をしたいとします。
- トリの慣性を障害物に影響させ、ぶつかったら衝撃と同じ方向に障害物を吹き飛ばす
この場合、本来は物理エンジンが計算してくれる処理を、手動で計算して障害物に力を加え なくてはなりません。
直感にそってトリのほうを動かしていれば、Unityの物理エンジン任せで正しい動きが得られるのです。
障害物のスクリプトを組む
通常、ゲームの流れを制御するスクリプトを GameController などという名前で配置するのが一般的ですが、ここではあえて使用しません。 そのかわり、 障害物がプレイヤーの数メートル後ろにきたら、プレイヤーの数メートル前に瞬間移動させる というスクリプトを障害物自体に組み込んでおけば、ステージ自動生成っぽい動作になって、必要な仕様は満たすことができます。
まるだしくんが進んでいけば、かわした障害物が自動的に前方に再配置されるという寸法です。
下がObstacleにアタッチするスクリプトの内容です。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Obstacle : MonoBehaviour { Transform PlayerTransform; void Start () { // プレイヤーのGameObjectを取得する PlayerTransform = GameObject.FindWithTag("Player").transform; } void Update () { if (PlayerTransform.position.x - transform.position.x > 30) { // プレイヤーの5メートル後方にきたら、プレイヤーの前方に移動する Vector3 nextPosition = transform.position; nextPosition.x += 45; transform.position = nextPosition; } } }
Start関数でまるだしくんのTransformを取得し、
Update関数内で位置関係を監視&自分の位置を移動します。
ここでは障害物を15メートルおきに配置したので、移動する距離は45メートルです。
移動位置、上下位置は好みに応じて変更してください。
また、まるだしくんには、デフォルトで用意されているPlayerというタグをつけておきましょう。 そうすることでGameObject.FindWithTagで見つけることができます。
ここまでで、ゲームに必要な最低限の要素は揃ってしまいました。
Unity上で実行するとこんなかんじです。
- ゲームビュー
- シーンビュー
残りの処理
さて、このあとゲームとして遊べるようにするには
- 点数カウント表示
- ゲームオーバー後のリトライ
などが残っています。 さほど難しくないと思うので、これらは自分でプログラムしてみてください!