いんでぃーづ

ゲームメインのブレブレブログ。ゲーム,Unity,デザイン,UI/UX

あのゲームを雑に再現する:フラッピーバード その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.


Amazon.co.jpアソシエイト


免責事項

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

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

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