Unityゲームの作り方メモフラッピーバード

【Unity】フラッピーバード風ゲームの作り方②~障害物を作成する

Unity

1. はじめに

Unityでゲームを作りたい!でも、どんなゲームから始めればいいのか迷いますよね。そこでおすすめしたいのが、フラッピーバード風のゲームです。このゲームは操作がシンプルで、初心者にとってUnityの基本操作やスクリプトを学ぶのに最適なプロジェクトです。

この記事では、フラッピーバード風ゲームの中で使用する「障害物」の作り方を説明します。

Unity初心者でも簡単に理解できるように、障害物の基本的な作り方から、スクリプトを使った動きの設定、さらに自動生成までをステップバイステップで解説します。一緒にフラッピーバード風ゲームを完成させていきましょう!



2. 障害物の基本作成

この記事では、フラッピーバード風ゲームの障害物を作成する手順をわかりやすく解説します。まずは、障害物をシーンに配置し、それを使いやすいプレファブとして準備しましょう。


1. 空のオブジェクトを作成する

最初に障害物の親オブジェクトを作成します。これにより、障害物の管理が簡単になります。

  1. ヒエラルキーウィンドウで 右クリック します。
  2. 「Create Empty」 を選択して、空のオブジェクトを作成します。
  3. 作成した空のオブジェクトを選択し、インスペクターウィンドウで名前を 「Block」 に変更します。

2. 子オブジェクトとして長方形を追加する

障害物を構成する2つの長方形を「Block」の子オブジェクトとして追加します。

  1. ヒエラルキーウィンドウで「Block」を右クリックします。
  2. 「2D Object」 → 「Square」 を選択し、長方形を作成します。
  3. 同じ手順で、もう1つ「Square」を作成します。
  4. 作成された2つの「Square」を、それぞれ 「SquareUP」「SquareDown」 に名前を変更します。

3. スプライトを設定し位置を調整する

次に、障害物の見た目を設定し、適切な位置に配置します。

  1. 「SquareUP」と「SquareDown」をそれぞれ選択します。
  2. インスペクターウィンドウで 「Sprite Renderer」 の項目を確認し、任意のスプライト(例: 白い四角)を設定します。
  3. 「SquareUP」 の位置を (0, 5, 0) に設定します。
  4. 「SquareDown」 の位置を (0, -5, 0) に設定します。

4. コライダーを追加する

障害物に衝突判定を追加します。

  1. 「SquareUP」と「SquareDown」を選択します。
  2. インスペクターウィンドウで 「Add Component」 をクリックします。
  3. 「Box Collider 2D」 を選択し、追加します。

5. プレファブとして保存する

障害物をプレファブにしておくことで、再利用が簡単になります。

  1. ヒエラルキーウィンドウで「Block」を選択します。
  2. プロジェクトウィンドウ に「Block」をドラッグアンドドロップします。
  3. プロジェクトウィンドウに「Block」のプレファブが作成されていることを確認します。

これで障害物の基本的な作成は完了です!次は、これを動かすスクリプトを作成し、ゲームの中で障害物を動かす方法を解説します。



3.障害物の移動スクリプト

このステップでは、作成した障害物が左方向に移動し、画面外に出たら自動的に削除されるようにスクリプトを設定します。以下の手順に従って進めてみましょう!


1. スクリプトを作成する

まずは、障害物の動きを制御するスクリプトを作成します。

  1. プロジェクトウィンドウを右クリックして、「Create」 → 「C# Script」を選択します。
  2. スクリプトの名前を「ObstacleController」にします。

2. スクリプトをアタッチする

次に、作成したスクリプトを障害物のプレファブにアタッチします。

  1. ヒエラルキーウィンドウから「Block」プレファブを選択します。
  2. プロジェクトウィンドウから「ObstacleController」スクリプトをドラッグし、Blockのインスペクターウィンドウにドロップします。

3. スクリプトのコードを書く

スクリプトをダブルクリックして開き、以下のコードを入力します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObstacleController : MonoBehaviour
{
    public float speed = 2f;  // 障害物の移動速度
    private float leftBound = -10f;  // 障害物が消える位置

    void Update()
    {
        // 障害物を左に移動させる
        transform.position += Vector3.left * speed * Time.deltaTime;

        // 障害物が画面外に出たら削除する
        if (transform.position.x < leftBound)
        {
            Destroy(gameObject);
        }
    }
}

4. コードの解説

  • public float speed = 2f;
    この変数は障害物の移動速度を調整するためのものです。値を変更すれば簡単にスピードをカスタマイズできます。
  • transform.position += Vector3.left * speed * Time.deltaTime;
    障害物が左方向(Vector3.left)に移動する処理です。Time.deltaTimeを掛けることでフレームレートに依存しない動きになります。
  • if (transform.position.x < leftBound)
    この条件式で、障害物が画面外(左端)に出たかをチェックします。
  • Destroy(gameObject);
    条件に合致した場合、gameObjectを削除します。これによりメモリの無駄遣いを防げます。

5. 動作確認

Unityエディターでゲームを再生し、障害物が左方向にスムーズに移動し、画面外に出ると削除されることを確認してください。もし動かない場合は、以下のポイントをチェックしましょう。

  • 「ObstacleController」スクリプトが正しくアタッチされているか?
  • 入力したコードにミスがないか?

このステップを完了すれば、障害物が動くようになります!次は「障害物生成スクリプト」を作成して、複数の障害物を自動生成する仕組みを追加しましょう!



4. 障害物生成スクリプト

この記事では、障害物をランダムな位置に一定間隔で自動生成する方法を解説します。これにより、ゲームがよりダイナミックで楽しいものになります!


1. スクリプトの作成

まず、障害物を生成するためのスクリプトを作成しましょう。

  1. プロジェクトウィンドウを右クリック
    「Create」 → 「C# Script」を選びます。
  2. スクリプトの名前を ObstacleSpawner に設定します。
  3. 作成したスクリプトをダブルクリックして開き、以下のコードを入力してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObstacleSpawner : MonoBehaviour
{
    public GameObject obstaclePrefab;  // 生成する障害物のプレハブ
    public float spawnRate = 3f;       // 障害物が生成される間隔
    private float timer = 0f;

    void Update()
    {
        // 時間を加算
        timer += Time.deltaTime;

        // 一定時間ごとに障害物を生成
        if (timer >= spawnRate)
        {
            // ランダムな位置で障害物を生成
            Instantiate(obstaclePrefab, new Vector3(10, Random.Range(-2f, 2f), 0), Quaternion.identity);
            timer = 0f;  // タイマーをリセット
        }
    }
}

2. スクリプトの解説

このスクリプトでは以下のことを行っています:

  • obstaclePrefab
    生成する障害物のプレハブ(Prefab)を設定します。
  • spawnRate
    障害物を生成する間隔を秒単位で指定します。
  • タイマーの更新
    Update メソッド内で毎フレーム Time.deltaTime を加算し、一定時間経過後に障害物を生成します。
  • ランダムな位置で生成
    Random.Range を使って、障害物の生成位置を上下方向にランダム化しています。

3. スクリプトを空のオブジェクトにアタッチ

  1. ヒエラルキーウィンドウで右クリックして「Create Empty」を選択します。
  2. 作成した空のオブジェクトに「Spawner」と名前を付けます。
  3. Spawner を選択し、インスペクターウィンドウで以下を設定します:
    • 先ほど作成した ObstacleSpawner スクリプトをドラッグしてアタッチします。
    • プロジェクトウィンドウから「Block」プレハブをドラッグし、「Obstacle Prefab」欄に設定します。

以上で、障害物を自動生成するスクリプトの設定が完了しました!次は、ゲームを実行して動作を確認しましょう!



5.テストプレイ

最後に、ゲームを実行して障害物が正しく動作するか確認してみましょう!


ゲームを実行する

  1. Unityエディタの上部にある「Play」ボタンをクリックします。
  2. ゲーム画面で以下の点を確認してください:
    • 障害物が一定間隔で生成されている。
    • 障害物が左方向に移動している。
    • 障害物が画面外に出ると自動的に削除されている。

動作に問題がある場合のチェックポイント

  • 障害物が生成されない場合
    • Spawnerオブジェクトに「ObstacleSpawner」スクリプトが正しくアタッチされているか確認。
    • 「Obstacle Prefab」に「Block」プレハブが設定されているか確認。
  • 障害物が動かない場合
    • 「ObstacleController」スクリプトの speed の値が0になっていないか確認。

ゲームが思った通りに動けば成功です!テストプレイを繰り返し、さらに改良したいポイントがあれば挑戦してみましょう。



よくある質問(FAQ)

Q
生成される障害物の速度を変更したい
A

障害物の速度を変更するには、「ObstacleController」スクリプト内の speed 変数を変更します。例えば、現在の値が 2f なら、 3f に変更すると移動速度が速くなります。

public float speed = 3f; // 新しい速度

変更後は、スクリプトを保存して再生ボタンを押すと、速度が反映されます。

Q
障害物の生成間隔を調整するには?
A

障害物の生成間隔は「ObstacleSpawner」スクリプト内の spawnRate 変数で調整できます。例えば、 spawnRate3f から 1.5f に変更すると、障害物がより頻繁に生成されます。

public float spawnRate = 1.5f; // 生成間隔を短くする

間隔を変更した後、必ず再生ボタンを押して結果を確認してください。

Q
エラーが出た場合の対処法
A

以下はよくあるエラーの原因と解決方法です。

  1. エラー例: “NullReferenceException”
    • 原因: 「Spawner」の Obstacle Prefab にプレハブが設定されていない可能性があります。
    • 解決方法: ヒエラルキーで「Spawner」を選択し、インスペクターの「Obstacle Prefab」に「Block」プレハブをドラッグアンドドロップします。
  2. エラー例: “Unassigned Reference Exception”
    • 原因: スクリプト内で設定している変数が空のままになっています。
    • 解決方法: スクリプト内の全ての公開変数(public)に正しいオブジェクトが設定されているか確認してください。
  3. 障害物が画面に表示されない
    • 原因: 障害物の位置がカメラの視野外になっている可能性があります。
    • 解決方法: 「ObstacleSpawner」スクリプト内の障害物生成位置(new Vector3(10, Random.Range(-2f, 2f), 0))を調整してください。たとえば、 Random.Range(-2f, 2f) の値を広げることで、生成範囲を変更できます。

おすすめのアセット

「Flappy Fish UI」は、シンプルで使いやすい2DのUIテンプレートです。このアセットは、クラシックな「フラッピーバード」風ゲームのUIをデザインするために最適で、初心者でも簡単に組み込める設計が特徴です。魚や海をテーマにしたデザインが含まれており、カラフルで視覚的に楽しい要素が満載です。ボタンやメニュー、スコア表示など、ゲームに必要な基本的なUIパーツが揃っているため、すぐにプロジェクトに活用できます。