Unity初心者向け!シンプルな2Dゲームで学ぶスコア管理とUI表示

Unityは、初心者からプロフェッショナルまで幅広い開発者に利用されているゲームエンジンです。

この記事では、Unityを使ってシンプルな2Dゲームを作成し、ゲーム内のスコアを管理する方法と、UIでそのスコアを表示する手順を紹介します。

初級レベルの内容となっているので、Unityの基礎知識があればすぐに実践できます。プログラム初心者の方でもわかりやすいように、具体的なコード例や設定手順を交えて説明していきます。


Unityプロジェクトの作成と基本設定

まずは、Unity Hubから新しい2Dプロジェクトを作成します。プロジェクト作成後、シーンの基本設定を行い、ゲームオブジェクトやUIコンポーネントを配置する準備をしましょう。

  1. プロジェクトの作成
    Unity Hubを起動し、「新規プロジェクト」ボタンをクリックします。
    テンプレートは「2D」を選択し、プロジェクト名を「Simple2DGame」と設定します。
  2. シーンのレイアウト
    プロジェクトが作成されたら、シーンビューにて背景やプレイヤーのキャラクターを配置します。ここでは、簡単なスプライト(画像)を使ってキャラクターや背景を設定します。
    スプライトはUnity Asset Storeからダウンロードするか、自作の画像を利用しても構いません。
  3. UIキャンバスの追加
    メニューから「GameObject」→「UI」→「Text」を選択して、UIキャンバス上にテキストオブジェクトを配置します。
    このテキストオブジェクトは、後ほどスコア表示に利用します。初期設定として、Textの内容を「Score: 0」としておくとわかりやすいでしょう。

スコア管理の実装

次に、ゲーム内でスコアを管理するためのスクリプトを作成します。ここでは、プレイヤーが敵を倒すなどのイベントをスコアに反映させるシンプルな例を紹介します。

スクリプトの作成

プロジェクトウィンドウ内で右クリックし、「Create」→「C# Script」を選択します。スクリプト名は「ScoreManager」としましょう。

ScoreManagerスクリプトの内容

以下は、ScoreManagerの基本コード例です。

using UnityEngine;
using UnityEngine.UI;

public class ScoreManager : MonoBehaviour
{
    // スコアの初期値
    public int score = 0;
    // UIテキストを格納する変数
    public Text scoreText;

    // ゲーム開始時に呼ばれる
    void Start()
    {
        UpdateScoreUI();
    }

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

    // UI上のテキストを更新するメソッド
    void UpdateScoreUI()
    {
        scoreText.text = "Score: " + score.ToString();
    }
}

このコードでは、scoreという変数で現在のスコアを管理し、AddScoreメソッドでスコアに値を加算します。加算後、UpdateScoreUIメソッドを呼び出して、UI上のテキストを更新します。

UIテキストとの連携

スクリプトを適用するため、シーン上の任意の空のGameObject(例:GameManager)にScoreManagerスクリプトをアタッチします。

その後、Inspectorビューで「Score Text」フィールドに先ほど作成したTextオブジェクトをドラッグ&ドロップして連携させます。


ゲーム内でのスコア加算処理

実際のゲームシーンでスコアを加算するタイミングは、例えば敵キャラクターを倒した時やアイテムを取得した時などが考えられます。ここでは、シンプルな例として、プレイヤーが特定のキー(例:スペースキー)を押したときにスコアが増加する処理を実装します。

プレイヤーの入力処理の追加

プレイヤーキャラクターのスクリプトに、入力を検知してScoreManagerのAddScoreメソッドを呼び出す処理を追加します。以下はその例です。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public ScoreManager scoreManager;

    void Update()
    {
        // スペースキーが押されたらスコアを10加算
        if (Input.GetKeyDown(KeyCode.Space))
        {
            scoreManager.AddScore(10);
        }
    }
}

このコードは、Updateメソッド内でスペースキーの入力を検知し、ScoreManagerに対して10ポイントの加算を実行します。

※ プレイヤーオブジェクトにこのスクリプトをアタッチし、Inspector上でScoreManagerの参照を設定してください。

シーン全体のテスト

すべての設定が完了したら、Unityエディタ上で再生ボタンを押し、スペースキーを押してスコアが正しく更新されるか確認します。

UIのテキストが「Score: 10」「Score: 20」といったように変化するかを確認することで、スクリプトの動作を検証できます。


UIのカスタマイズと発展的なアイデア

基本的なスコア管理とUI表示が実装できたら、ここからさらに発展的な機能を追加してみましょう。

UIのデザイン調整
  • フォントサイズ・色の変更: Inspector上でTextオブジェクトのフォントサイズや色、配置を調整することで、より見やすいUIに仕上げることができます。
  • アニメーションの追加: スコアが更新されるタイミングでテキストにフェードイン・フェードアウトのアニメーションを加えると、視覚的に面白い演出が可能です。
スコアの永続化

ゲームを終了してもスコアが保存されるように、PlayerPrefsを使った永続化処理を学ぶのも良いでしょう。

例えば、ゲーム終了時にPlayerPrefs.SetInt(“HighScore”, score)のようにしてハイスコアを保存し、次回起動時に読み込むことができます。

複数のUI要素の連携

ゲームオーバー時に最終スコアを表示したり、リトライボタンを実装することで、より本格的なゲームの仕上がりにすることも可能です。

UnityのUIシステムはCanvas、Panel、Buttonなど多彩なコンポーネントを提供しているので、これらを組み合わせて自由なUIをデザインしてみましょう。


コードの実践例

ここまでの内容をもとに、実際のシーンで動作するサンプルシーンの構成をまとめます。

シーン構成
  • GameManagerオブジェクト: ScoreManagerスクリプトをアタッチ。
  • UI Canvas: Textオブジェクトを配置し、スコア表示用として設定。
  • Playerオブジェクト: PlayerControllerスクリプトをアタッチし、ScoreManagerオブジェクトへの参照をInspectorで設定。
  • 背景・敵キャラクター等(任意): ゲームに彩りを与えるために追加しても良いです。
動作確認

Unityエディタで再生ボタンを押し、プレイヤー操作(スペースキー入力)によるスコアの加算とUIの更新が正しく行われることを確認します。

不具合があれば、各スクリプトの参照設定やコード内のミスを再度チェックしましょう。


まとめ

今回の記事では、Unityを使ってシンプルな2Dゲームの中でスコア管理とUI表示の基本的な実装方法を学びました。

  • プロジェクトの作成方法
  • UIキャンバスの追加とTextオブジェクトの配置
  • ScoreManagerスクリプトによるスコア管理
  • PlayerControllerスクリプトでの入力検知とスコア加算処理

これらの基本的な操作を習得することで、より複雑なゲーム開発への第一歩を踏み出すことができます。さらに、今回紹介したコードや設定はシンプルなものですが、発展的なアイデア(UIデザインの改善やスコアの永続化など)にも応用可能です。

実際に手を動かしながら、自分なりのアレンジを加えてみてください。


演習問題とその解答例

演習問題

以下の演習問題に挑戦してみましょう。

  1. 問題1: スコアの減算機能の実装
    今回のScoreManagerスクリプトに、スコアを減算する機能を追加してください。例えば、プレイヤーが障害物に衝突したときにスコアを5減算する処理を実装しましょう。
  2. 問題2: ハイスコアの保存
    ゲーム終了時に、現在のスコアがこれまでのハイスコアを上回っていた場合、ハイスコアとして保存する機能を実装してください。保存にはUnityのPlayerPrefsを使用し、次回起動時にハイスコアを読み込んで表示するようにします。
  3. 問題3: UIテキストのアニメーション追加
    スコアが更新されるたびに、UI上のTextオブジェクトが一瞬大きくなり、元のサイズに戻るアニメーションを実装してください。Tweenライブラリ(例:DOTween)を使用しても構いません。

解答例

解答例1: スコアの減算機能の追加

ScoreManagerスクリプトに、以下のようなSubtractScoreメソッドを追加します。

public void SubtractScore(int value)
{
    score -= value;
    if (score < 0)
    {
        score = 0; // スコアが負の値にならないように調整
    }
    UpdateScoreUI();
}

プレイヤーキャラクターのスクリプトなどで、障害物に衝突した際にこのメソッドを呼び出します。

解答例2: ハイスコアの保存

ScoreManagerスクリプトにハイスコア管理のためのコードを追加します。例えば、ゲーム終了時に以下のようなメソッドを呼び出します。

public void SaveHighScore()
{
    int highScore = PlayerPrefs.GetInt("HighScore", 0);
    if (score > highScore)
    {
        PlayerPrefs.SetInt("HighScore", score);
    }
}

また、ゲーム開始時に保存されているハイスコアを読み込む場合は、Startメソッド内で以下のように行います。

void Start()
{
    int highScore = PlayerPrefs.GetInt("HighScore", 0);
    Debug.Log("Current High Score: " + highScore);
    UpdateScoreUI();
}
解答例3: UIテキストのアニメーション追加

DOTweenを利用する場合、まずパッケージマネージャーからDOTweenをインストールします。
その後、ScoreManagerのUpdateScoreUIメソッド内にアニメーション処理を追加します。

using DG.Tweening;

// 既存のUpdateScoreUIメソッド内に以下のコードを追加
void UpdateScoreUI()
{
    scoreText.text = "Score: " + score.ToString();
    // テキストのスケールを一時的に大きくしてから元に戻すアニメーション
    scoreText.transform.localScale = Vector3.one;
    scoreText.transform.DOScale(1.5f, 0.2f).OnComplete(() => {
        scoreText.transform.DOScale(1f, 0.2f);
    });
}

このコードにより、スコア更新時にTextオブジェクトが拡大し、すぐに元の大きさに戻るアニメーションが実現されます。


おわりに

今回の記事では、Unity初心者向けにシンプルな2Dゲームの作成を通して、スコア管理とUI表示の基本的な実装方法を学びました。

実際にコードを書いて動作を確認することで、Unityの基本的な操作やプログラミングの流れを理解することができるでしょう。また、記事内で紹介した演習問題に挑戦することで、さらなるスキルアップが期待できます。

皆さんもぜひ、このチュートリアルを参考にして、自分だけのオリジナルゲーム作成に挑戦してみてください!