いんでぃーづ

ゲームいろいろ、いろいろ自由

あのゲームを雑に再現する:フラッピーバード その2

フラッピーバードをパクって再現してみようというこの企画。

前回はプレイヤーの動きと、追尾カメラを作成しました。

ステージを作る

プレイヤーの次はステージです。

本家では上下に土管状の障害物がぶらさがっており、画面の右から左に一定スピードでスライドしていきます。

障害物を作る

障害物の画像は、みんなだいすきいらすとやさんからお借りしました。

f:id:sugar_affordance:20161215121056p:plain

これは上位概念としての社会、それに従属する会社、そこをかいくぐる社畜(まるだしくん)という現実社会をモチーフにしています。(どうでもいい)

オブジェクトの構造としては下のようにします。

f:id:sugar_affordance:20161215121231p:plain

Obstacle が障害物のルートオブジェクト、UpperObstacleが上の障害物でLowerObstableが下の障害物です。 UpperObstacleもしくはLowerObstableにプレイヤーが衝突するとゲームオーバーになります。

Obstacleはプレハブ化しておきましょう。

これをあらかじめシーンに3つほど並べて配置しておきます。

f:id:sugar_affordance:20161215121315p:plain

ステージの仕様のキモ

最大の悩みどころは、プレイヤーを移動させるかステージを移動させるか ということです。

フラッピーバードは自動生成のステージなので、延々とゲームが続けば、シーンの限界位置まで移動してオーバーフローを起こしてしまうかもしれません。

ゲーム作りをしていると、こういった悩みに頻繁にぶつかると思います。 こういう場合の 無難な解決方法 として、 直感的に正しいほう を選びましょう。

フラッピーバードの場合、トリが土管の間をかいくぐっていくというモチーフのゲームです。 なので、トリが移動するほうが直感的に正しいと言えます。

これはなんとなく言っているわけではなく、ちゃんとした理由があります。

それはズバリ 物理エンジン の関係です。

ステージを動かしてしまう場合、トリの処理は トリを垂直に跳ねさせる ということになります。

そこで以下のような仕様変更をしたいとします。

  • トリの慣性を障害物に影響させ、ぶつかったら衝撃と同じ方向に障害物を吹き飛ばす

この場合、本来は物理エンジンが計算してくれる処理を、手動で計算して障害物に力を加え なくてはなりません。

直感にそってトリのほうを動かしていれば、Unityの物理エンジン任せで正しい動きが得られるのです。

障害物のスクリプトを組む

通常、ゲームの流れを制御するスクリプトGameController などという名前で配置するのが一般的ですが、ここではあえて使用しません。 そのかわり、 障害物がプレイヤーの数メートル後ろにきたら、プレイヤーの数メートル前に瞬間移動させる というスクリプトを障害物自体に組み込んでおけば、ステージ自動生成っぽい動作になって、必要な仕様は満たすことができます。

まるだしくんが進んでいけば、かわした障害物が自動的に前方に再配置されるという寸法です。

f:id:sugar_affordance:20161215121934p:plain

下が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で見つけることができます。

f:id:sugar_affordance:20161215121646p:plain


ここまでで、ゲームに必要な最低限の要素は揃ってしまいました。

Unity上で実行するとこんなかんじです。

  • ゲームビュー

f:id:sugar_affordance:20161215122431g:plain

  • シーンビュー

f:id:sugar_affordance:20161215122125g:plain

残りの処理

さて、このあとゲームとして遊べるようにするには

  • 点数カウント表示
  • ゲームオーバー後のリトライ

などが残っています。 さほど難しくないと思うので、これらは自分でプログラムしてみてください!


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。