今回は誰もが知ってるあのゲームの作り方を再現してみようという内容です。
「フラッピーバード」のゲームシステムを再現してみましょう。
知らない人のために内容を説明すると、タップするトリを操ってひたすら土管の間をくぐっていくという単純なゲーム。
ただ、そのシビアな当たり判定のために、 まともな点数を稼ぎ出すことが困難 という、どう考えてもクソゲーな内容にもかかわらず、
世界中で流行して1日に500万円を稼ぎ出し、ストア中にコピーゲームがあふれ、コピーがリジェクトされるようになると今度はWebブラウザアプリがあふれ出したという伝説のゲームなのです!
これを作れればあなたも億万長者です。保証はしません。
開発環境はUnityを使います。
著作権的にやばいことはやらないつもりなのでご安心を。
Unityプロジェクトを作成する。
新規で2Dプロジェクトを作成しましょう。
3Dゲームとして作ることもできますが、2Dゲームは3Dより作るのが圧倒的に簡単です。
2DはX,Yの二軸、3DはそれにZ軸を加えるわけですが、 1軸増えるだけで考えなくてはならないことは倍 になります。
また、単純なゲームなのでシーンも一つで十分です。
(このように、ゲーム作りをするうえで必要最低限の作業量ですませたがる心を雑味(ざつみ)と呼びます。今決めました。)
あと今回はマウスで操作することを前提で作ります。
プレイヤーを作る
さて、素材を本家アプリやコピーアプリから持ってきたらもちろん著作権でアウトなので、今回は私がベジェ曲線で適当に書いたオリジナルキャラクター、 まるだしくん をプレイヤーとして採用します。
名称的にも見た目的にも 限りなくまるだし ですがこちらを使っていきます。
(ちなみにまるだしくんはパブリックドメインなのでどこで使っていただいてもかまいません。こんなものを勝手にパブリックにされても社会のほうが迷惑かもしれませんが)
まるだしくんの動きは
- 画面をタップしたら飛び跳ねる
- 障害物にぶつかったら真下に落ちていく(ゲームオーバー)
というシンプルなものです。
シーンにオブジェクトを配置する
まるだしくんのPNGファイルをUnityにドラッグ&ドロップし、インポートします。 インスペクタを見ると以下のようになっていると思います。
このファイルをシーンにドラッグ&ドロップして配置します。
配置したまるだしくんGameObjectには Rigidbody 2D コンポーネント、Polygon Collider 2D コンポーネントをアタッチします。
シーンが一つしかないのでプレハブにする必要もないでしょう。
プレイヤーのスクリプトを作成
Marudasikunnという名前でスクリプトを作成し、オブジェクトにアタッチします。
クリックしたら飛び跳ねる動きのプログラム
クリックの検出はセオリーどおり Update 関数内で Input クラスを参照します。
void Update () { if (Input.GetMouseButtonDown(0)) // マウスの左クリックされた { // 移動ベクトルをむりやり変える GetComponent<Rigidbody2D>() .velocity = new Vector3(4, 20); } }
これだけでスクリプトの操作部分は完成です。
ここで Rigidbody2Dの velocity に直接値を代入していますが、AddForce関数ではだめかと考えるかもしれません。 AddForceだと力を加える前のベクトルが影響してしまうため、フラッピーバードとは違う手触りのゲームになります。ここは好みで。
また、デフォルトの重力設定だと動作がもっさりしてしまうので、 Rigidbody 2D のGravity Scale の値を7くらいにすると、本家のキビキビした動作に近づきます。
障害物にぶつかったら操作不能にする
障害物以外にぶつかるものなどないので、 OnCollisionEnter2D が発生したら問答無用でゲームオーバー(操作不能)です。
void OnCollisionEnter2D (Collision2D coll) { // 問答無用でゲームオーバー GetComponent<Rigidbody2D>().velocity = new Vector3(0, 5); this.enabled = false; }
ベクトルを真上にして垂直にちょっとだけハネさせ、スクリプト自体は disable にしてしまいます。 2Dの場合の衝突検出はOnCollisionEnterではなく OnCollisionEnter2D 関数になるので注意。
カメラ
まるだしくんを追いかけてカメラを移動させるため、カメラにスクリプトを付けます。
Y軸は無視してX軸のみ追尾するというスクリプトです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MainCamera : MonoBehaviour { [SerializeField] Transform PlayerTransform; // まるだしくんのGameObject void Update () { Vector3 NextPosition = transform.position; // 現在の座標を取得 NextPosition.x = PlayerTransform.position.x; // X座標をプレイヤーと同じ値にする transform.position = NextPosition; // 追尾 } }
PlayerTransform変数には、インスペクタでまるだしくんを設定しておきます。
ここでうっかりZ座標を0にしてしまうと、まるだしくんが画面から消えてしまいます。 2Dゲームの場合はカメラの Z座標はデフォルトで-10 のようなので、この値は変えないように注意しましょう。
ここまでで、プレイヤーの動きと追尾カメラが完成しました。