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

【Unity】フラッピーバード風ゲームの作り方④~スコア機能を追加する

Unity

1. はじめに

ゲームにスコア機能を追加するのは、プレイヤーに達成感を与えたり、競争心を刺激したりする上で欠かせない要素です。フラッピーバード風のゲームでも、障害物を通過するたびにスコアが増える仕組みがあれば、プレイヤーはゲームの進行を楽しみやすくなります。

この記事では、Unityを使ってスコア機能を簡単に実装する方法を解説します。まず、画面上にスコアを表示する方法から始めて、障害物を通過した際にスコアを加算する仕組みを作ります。プログラミング初心者でも取り組みやすいステップ形式で進めますので、Unityの基本操作に自信がない方でも安心して取り組めますよ!

一緒にスコア機能を実装して、ゲームをさらに楽しいものにしていきましょう!



2. スコア表示のためのUIを作成

この記事では、ゲーム画面にスコアを表示するためにUnityの「UI」を使って「Text」オブジェクトを作成します。スコアはプレイヤーにとって進捗を確認する重要な要素なので、デザインや配置にもこだわりましょう!


ステップ1: Textオブジェクトを追加する

  1. 「Hierarchy」ウィンドウで右クリックします。
  2. メニューから「UI」→「Legacy」→「Text」を選択してください。
  3. 新しく作成された「Text」オブジェクトの名前を「ScoreText」に変更します。

ステップ2: Textの基本設定

「ScoreText」オブジェクトを選択した状態で、インスペクターで以下のように設定を変更しましょう:

  1. Textフィールド: 初期状態で「Score: 0」と入力します。
  2. フォントサイズ: 見やすい大きさにするために「50」に設定します。
  3. フォントカラー: 白色に変更しましょう。(RGB値を「255,255,255」に設定)
  4. Rect Transform:
    • Position: X = -320, Y = 220, Z = 0
    • Size: Width = 1600, Height = 300

これで画面の上部にスコアが目立つように表示されます。


ステップ3: デザインを微調整する

よりプロフェッショナルな外観を目指す場合、以下のオプションも調整してみましょう:

  • フォントの変更: Unityに含まれているデフォルトフォント以外を使うことで、デザインを向上させることができます。
  • Text Alignment(テキストの配置): 中央揃えを選択することで、スコアが綺麗に整列します。
  • ShadowまたはOutline: Textに影やアウトラインを追加して視認性を高めます。(「Add Component」で「Shadow」または「Outline」を追加)

ステップ4: スコア表示を確認

作成した「ScoreText」が正しく配置されているか、Unityの「Play」ボタンを押して確認しましょう。初期状態では「Score: 0」と表示されているはずです。

次は、スコアが動的に更新されるように「GameManager」スクリプトを作成していきます!


これでスコア表示の準備は完了です!次のセクションでは、スコアを管理する方法について詳しく解説します。



3.スコアを管理するゲームマネージャーの作成

スコアを管理するためには、ゲーム全体を統括する役割を持つ「GameManager」スクリプトを作成します。このスクリプトでは、スコアをカウントしたり、スコアを画面に表示したりする処理を行います。


1. GameManagerスクリプトの作成

まずは、GameManagerスクリプトを作成しましょう。

  1. プロジェクトウィンドウを右クリックして、「Create」→「C# Script」を選択。
  2. 新しいスクリプトに「GameManager」と名前を付けます。
  3. スクリプトをダブルクリックして開き、以下のコードを入力してください。
using UnityEngine;
using UnityEngine.UI; // Textを操作するために必要

public class GameManager : MonoBehaviour
{
    public Text scoreText; // スコアを表示するUI
    private int score = 0; // 初期スコアは0

    void Start()
    {
        UpdateScoreText(); // 初期スコアを画面に表示
    }

    // スコアを加算するメソッド
    public void AddScore(int value)
    {
        score += value;
        UpdateScoreText(); // スコアを更新
    }

    // スコアの表示を更新するメソッド
    private void UpdateScoreText()
    {
        scoreText.text = "Score: " + score;
    }
}

2. GameManagerスクリプトをシーンに設定

GameManagerスクリプトを作成したら、シーン内で動作するように設定します。

  1. GameManagerオブジェクトの作成
    • Hierarchyウィンドウを右クリックして「Create Empty」を選択。
    • 新しい空のオブジェクトに「GameManager」と名前を付けます。
  2. GameManagerスクリプトのアタッチ
    • 作成した「GameManager」オブジェクトを選択。
    • Inspectorウィンドウの「Add Component」ボタンをクリックし、「GameManager」スクリプトを検索して追加します。
  3. ScoreTextのリンク設定
    • GameManagerオブジェクトを選択した状態で、Inspectorウィンドウの「Score Text」フィールドに、先ほど作成した「ScoreText」オブジェクトをドラッグアンドドロップします。

ここまでで、GameManagerスクリプトの基本的な設定は完了です。UnityのPlayボタンをクリックしてゲームを開始し、初期状態で「Score: 0」が画面に表示されることを確認してください。



4.障害物通過時のスコア増加処理

次に、プレイヤーが障害物を通過したときにスコアが増える仕組みを実装していきます。この機能を実現するためには、「ScoreArea」というトリガーゾーンを障害物に追加し、スコアを加算するスクリプトを作成します。以下の手順に沿って進めてみましょう!

1. 「ScoreArea」を作成する

まず、障害物(Block)のPrefabにスコア用の判定エリアを追加します。

  1. Block Prefab を開く
    • プロジェクトウィンドウから Block のPrefabをダブルクリックして編集モードに入ります。
  2. 空のオブジェクトを作成
    • ヒエラルキー内で右クリックして、「Create Empty」を選択し、名前を「ScoreArea」に変更します。
  3. Box Collider 2Dを追加
    • ScoreAreaオブジェクトを選択し、インスペクターから「Add Component」をクリック。
    • 「Box Collider 2D」を追加し、「Is Trigger」にチェックを入れます。
  4. サイズを調整
    • ScoreAreaのサイズを障害物の幅に合わせて調整します。これにより、プレイヤーが通過した瞬間を正確に判定できます。

2. スクリプト「ScoreTrigger」を作成する

次に、障害物を通過したときにスコアを加算するスクリプトを作成します。

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

public class ScoreTrigger : MonoBehaviour
{
    public GameManager gameManager; // GameManagerの参照

    void Start()
    {
        // シーン内のGameManagerを自動で探して設定する
        gameManager = FindObjectOfType<GameManager>();

        // GameManagerが見つからなかった場合のエラーチェック
        if (gameManager == null)
        {
            Debug.LogError("GameManagerがシーンに見つかりません。");
        }
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player")) // プレイヤーが通過したら
        {
            gameManager.AddScore(1); // スコアを1増やす
        }
    }
}
  1. ScoreTriggerをScoreAreaにアタッチ
    • ScoreAreaオブジェクトを選択し、作成した「ScoreTrigger」スクリプトをドラッグ&ドロップでアタッチします。

これで障害物を通過したときにスコアが増える処理が完成しました!次はテストプレイでさらに調整してみましょう。



5. テストプレイとデバッグ

スコア機能を実装したら、ゲームを実際に動かして正しく動作するか確認しましょう。以下は、テストプレイとデバッグの手順を紹介します。


1. ゲームを実行する

  1. Unityエディターの上部にある 再生ボタン(▶) をクリックして、ゲームをスタートします。
  2. プレイヤーキャラクターを操作して、障害物を通過するたびにスコアが正しく増えているか確認しましょう。

2. スコアが正しく表示されない場合

スコアが増えない、またはスコア表示が更新されない場合は、以下を確認してください:

  • 「ScoreText」の設定確認
    「GameManager」のインスペクターで、「ScoreText」フィールドに「ScoreText」オブジェクトが正しくドラッグ&ドロップされているか確認します。
  • コードのミス確認
    「GameManager」スクリプト内の AddScore メソッドや UpdateScoreText メソッドが正しく記述されているか確認してください。

3. 障害物通過時にスコアが増えない場合

障害物のスコアエリアが正しく機能していない場合は、次を確認します:

  • コライダーの設定
    「ScoreArea」に追加した「Box Collider 2D」の「Is Trigger」がオンになっているか確認してください。
  • スクリプトのアタッチ確認
    「ScoreTrigger」スクリプトが「ScoreArea」オブジェクトにアタッチされているか確認します。
  • タグの設定
    プレイヤーキャラクターに「Player」タグが正しく設定されているか確認してください。タグが一致しない場合、スコアが増加しません。

4. デバッグ方法

エラーが発生した場合は、Unityの「Console」ウィンドウを確認して、エラーメッセージをチェックしましょう。以下はよくあるエラー例です:

  • エラー例 1: “NullReferenceException”
    • 原因: 「GameManager」や「ScoreText」の参照が設定されていない。
    • 解決方法: インスペクターで正しいオブジェクトを設定する。
  • エラー例 2: “Tag not defined”
    • 原因: タグ「Player」が未設定。
    • 解決方法: プレイヤーキャラクターに「Player」タグを設定する。

5. 正常に動作するか確認

エラーが修正されたら再度プレイして、以下を確認してください:

  • 障害物を通過するたびにスコアが増える。
  • スコアがリアルタイムで更新されて表示される。

テストプレイが成功すれば、スコア機能の実装は完了です!次は、ゲームオーバー時のスコア表示やハイスコア機能を追加して、さらにゲームを改良してみましょう。



よくある質問(FAQ)

Q
スコアが正しく表示されない場合は?
A

スコアが正しく表示されない場合、以下の点を確認してください:

  1. Textオブジェクトが設定されているか確認
    「GameManager」スクリプトの scoreText フィールドに「ScoreText」オブジェクトを正しくドラッグアンドドロップしましたか?
  2. UpdateScoreTextメソッドの呼び出し
    AddScore メソッド内で UpdateScoreText が呼び出されていることを確認してください。
  3. スクリプトエラー
    コンソールにエラーが出ていないか確認し、エラーがあれば修正してください。
Q
障害物のコライダーが正しく機能しない時は?
A

障害物のコライダーに問題がある場合、以下をチェックしてください:

  1. Is Triggerのチェック
    「ScoreArea」に追加した「Box Collider 2D」の「Is Trigger」が有効になっていますか?
  2. コライダーのサイズ
    障害物を通過する位置に適切なサイズのコライダーが設定されているか確認してください。
  3. タグ設定
    プレイヤーオブジェクトに「Player」タグが設定されているか確認してください。タグ名が異なると OnTriggerEnter2D が反応しません。
Q
スコアがリセットされない問題の解決方法は?
A

スコアがゲームの再プレイ時にリセットされない場合、以下を確認してください:

  1. スコアの初期化
    ゲーム開始時にスコアをリセットするコードがあるか確認してください。例: score = 0;Start メソッドに記述します。
  2. シーンの再読み込み
    再プレイ時にシーンが正しくリロードされていることを確認してください。Retry メソッドで SceneManager.LoadScene("シーン名"); が呼び出されているか確認してください。
  3. デバッグログで確認
    スコアが増えるタイミングを確認するために Debug.Log("Score: " + score); を追加して動作を追跡しましょう。

おすすめのアセット

「Playmaker Essentials Pack」は、Playmakerを使ったゲーム開発に必要な基本的なテンプレートをまとめたパックです。これにより、視覚的なスクリプト作成が可能になり、プログラミングの知識がなくてもゲームロジックを構築できます。ジャンプや移動、アイテム取得などの基本的な機能が含まれているため、初心者でも直感的に使用でき、ゲーム制作をスムーズに進められます。