Unity 6でゲームクリアを表示する方法|TextMeshProとC#で終了条件を作る

Unity 6でTextMeshProとC#を使ってGAME CLEARを表示する初心者向け記事のアイキャッチ画像 Unity

前回は、Unity 6で複数のItemを配置し、PlayerがItemを取得するたびにTextMeshProのスコアが増える仕組みを作りました。

5つすべてのItemを取得すると、

Score: 5

まで増える状態になっています。

今回は、このスコアを利用してゲームのクリア条件を作ります。

具体的には、

Itemを取得する

Scoreが増える

Scoreが5になる

GAME CLEAR!を表示する

という流れです。

ゲームには「何をすればクリアなのか」という目的が必要です。

今回はTextMeshProとC#を使って、これまで作ってきたゲームに簡単な終了条件を追加していきます。

前回のスコア表示についてはこちらの記事で解説しています。

Unity 6でスコアを表示する方法|TextMeshProでアイテム取得数をカウント

今回作るもの

現在のゲームでは、5つのItemを取得するとスコアが、

Score: 5

になります。

今回はCanvasに新しく、

GameClearText

を作成します。

ゲーム開始時にはGameClearTextを非表示にしておきます。

そして5つ目のItemを取得したときだけ、

GAME CLEAR!

と画面中央へ表示します。

今回の主な流れは、

  • TextMeshProでGameClearTextを作成する
  • GameClearTextを画面中央に配置する
  • 最初はGameClearTextを非表示にする
  • ScoreManagerへクリア条件を追加する
  • GameClearTextをScoreManagerへ設定する
  • Scoreが5になったか判定する
  • 5つのItemを取得してGAME CLEAR!を表示する

となります。

TextMeshProでGameClearTextを作成する

前回作成したCanvasには、

ScoreText

があります。

今回は同じCanvasの中に、もう1つTextMeshProのTextを作成します。

Hierarchyから、

Canvas → UI → Text – TextMeshPro

を作成します。

作成したTextの名前を、

GameClearText

に変更します。

Hierarchyは、

Canvas
├─ ScoreText
└─ GameClearText

という状態になります。

GameClearTextの文字を設定する

GameClearTextを選択し、TextMeshProのTextを、

GAME CLEAR!

に変更します。

ゲームクリアしたことが一目で分かるように、ScoreTextよりも大きな文字にします。

例えば、

Font Size = 64

程度から始めます。

また、文字を中央揃えにしておくと見やすくなります。

ゲーム画面の大きさによって文字サイズは調整しても問題ありません。

GameClearTextを画面中央に配置する

次にGameClearTextを画面中央へ配置します。

Rect TransformのAnchor Presetsを使って、中央へ配置します。

Gameビューで、

GAME CLEAR!

が画面中央付近に表示されていればOKです。

幅が足りず文字が途中で改行された場合は、Rect TransformのWidthを広げます。

例えば、

Width = 600

Height = 120

程度にすると余裕があります。

Unity 6でTextMeshProを使って画面中央にGAME CLEARを表示した画面
TextMeshProでGameClearTextを作成し、ゲーム画面の中央に「GAME CLEAR!」を配置します。

ゲーム開始時はGameClearTextを非表示にする

ゲーム開始直後からGAME CLEAR!が表示されていると困ります。

そのため、ゲーム開始時にはC#からGameClearTextを非表示にします。

そしてスコアが5になったときだけ表示します。

今回はScoreManagerのStart()内で、

gameClearText.gameObject.SetActive(false);

を実行します。

SetActive(false)を使うと、そのGameObjectを非表示にできます。

反対に、

gameClearText.gameObject.SetActive(true);

とすると、再び表示できます。

AIにゲームクリア処理を質問する

今回もAIへ現在の状態を伝えて、ゲームクリア処理を追加する方法を質問します。

例えばChatGPTへ次のように質問します。

Unity 6で3Dゲームを作っています。
PlayerにはScoreManagerがあり、Itemを取得するたびにスコアが1増えます。
5つのItemをすべて取得するとScoreが5になります。
CanvasにTextMeshProでGameClearTextを作成しました。
ゲーム開始時はGameClearTextを非表示にし、Scoreが5になったら「GAME CLEAR!」を表示したいです。
現在のScoreManagerへ追加できる初心者向けのシンプルなC#コードを作ってください。

ChatGPTにUnity 6のゲームクリア処理を質問した画面
Scoreが5になったら「GAME CLEAR!」を表示する処理をChatGPTに質問します。

AIへ、

ScoreManagerを使用している

クリア条件はScore = 5

GameClearTextはTextMeshPro

最初は非表示

という条件を具体的に伝えます。

ScoreManagerにゲームクリア処理を追加する

前回作ったScoreManagerを修正します。

今回は次のようにします。

using TMPro;
using UnityEngine;

public class ScoreManager : MonoBehaviour
{
    [SerializeField] private TMP_Text scoreText;
    [SerializeField] private TMP_Text gameClearText;
    [SerializeField] private int clearScore = 5;

    private int score = 0;

    private void Start()
    {
        gameClearText.gameObject.SetActive(false);
        UpdateScoreText();
    }

    public void AddScore(int amount)
    {
        score += amount;

        UpdateScoreText();
        CheckGameClear();
    }

    private void UpdateScoreText()
    {
        scoreText.text = $"Score: {score}";
    }

    private void CheckGameClear()
    {
        if (score >= clearScore)
        {
            gameClearText.gameObject.SetActive(true);
        }
    }
}
UnityでScoreが5になったらGAME CLEARを表示するScoreManagerのC#コード
ScoreManagerにゲームクリア判定を追加し、ScoreがClear Score以上になるとGameClearTextを表示します。

保存したらUnityへ戻り、Consoleに赤いエラーが表示されていないことを確認します。

gameClearTextをInspectorから設定する

今回追加した、

[SerializeField] private TMP_Text gameClearText;

によって、PlayerのScoreManagerに、

Game Clear Text

という項目が追加されます。

ここへHierarchyの、

Canvas → GameClearText

をドラッグします。

前回のScoreTextと同じように、InspectorからTextMeshProのオブジェクトをC#スクリプトへ渡しています。

最終的にScoreManagerには、

Score Text = ScoreText

Game Clear Text = GameClearText

Clear Score = 5

が設定されます。

UnityでScoreManagerにGameClearTextとClear Score 5を設定した画面
PlayerのScoreManagerにGameClearTextを設定し、ゲームクリアに必要なClear Scoreを5にします。

clearScoreでクリアに必要なスコアを設定する

今回のコードでは、

[SerializeField] private int clearScore = 5;

を追加しています。

この変数には、ゲームクリアに必要なスコアを保存します。

今回はItemが5個あるため、

Clear Score = 5

です。

このように数字を変数として用意しておくと、後からItemを10個に増やした場合でも、

Clear Score = 10

へ変更できます。

コード内に直接5を書くよりも、Inspectorから設定できるようにしておくと調整しやすくなります。

CheckGameClearでクリア条件を確認する

今回追加した、

private void CheckGameClear()
{
    if (score >= clearScore)
    {
        gameClearText.gameObject.SetActive(true);
    }
}

がゲームクリアを判定する部分です。

Itemを取得するたびにAddScore()が実行されます。

その中で、

CheckGameClear();

を呼び出します。

例えばScoreが4の場合、

4 >= 5

ではないため、GAME CLEAR!は表示されません。

5つ目のItemを取得すると、

5 >= 5

となるため条件が成立します。

そこで、

gameClearText.gameObject.SetActive(true);

が実行されます。

なぜ「==」ではなく「>=」を使うのか

ゲームクリアの判定には、

score >= clearScore

を使用しています。

今回のように必ず1ずつ増える場合は、

score == clearScore

でも動作します。

ただし将来的に、1つのItemで2ポイント増えるなどの仕組みを追加すると、スコアがクリア条件を飛び越える可能性があります。

そのため、

クリアに必要なスコア以上になったらクリア

という意味になる>=を使っています。

Playモード開始時の状態を確認する

設定が終わったらPlayボタンを押します。

ゲーム開始時には、

Score: 0

が表示されます。

一方、

GAME CLEAR!

は表示されていないことを確認します。

これでStart()内の、

gameClearText.gameObject.SetActive(false);

が正常に動作していることが分かります。

Itemを取得してスコアを増やす

PlayerをW・A・S・Dキーで操作してItemを取得します。

1つ目を取得すると、

Score: 1

2つ目を取得すると、

Score: 2

と増えていきます。

Scoreが1〜4の間は、まだGAME CLEAR!を表示しません。

最後のItemを取得するまでゲームを続けます。

5つすべて取得するとGAME CLEAR!が表示される

最後のItemを取得すると、

Score: 5

になります。

同時に画面中央へ、

GAME CLEAR!

と表示されれば成功です。

Unity 6で5つのItemを取得してScore 5とGAME CLEARが表示された画面
5つのItemをすべて取得するとScoreが5になり、画面中央に「GAME CLEAR!」が表示されます。

これで、

PlayerがItemを集める

スコアが増える

5つすべて取得する

ゲームクリアになる

という一連のゲームルールが完成しました。

GAME CLEAR!が表示されない場合

Scoreが5になってもGAME CLEAR!が表示されない場合は、まずPlayerを選択します。

ScoreManagerの、

Game Clear Text

にGameClearTextが設定されているか確認してください。

さらに、

Clear Score = 5

になっていることも確認します。

次にScoreManager.csが今回の新しいコードになっているか確認します。

Consoleに赤いエラーが表示されている場合は、そのエラー内容も確認してください。

Scoreそのものが増えない場合は、前回の記事で設定した、

ItemPickup

ScoreManager

ScoreText

の設定も確認します。

ゲームに目的と終了条件が追加された

これまでのゲームではPlayerを移動したり、Itemを取得したりすることはできましたが、「何をすればゲームをクリアできるのか」という明確な目的はありませんでした。

今回、

5つのItemを集める

という目的と、

Scoreが5になったらGAME CLEAR!

という終了条件を追加しました。

シンプルではありますが、これによってゲームとしての基本的な流れができました。

ゲーム制作では、

開始

プレイヤーが操作する

目的を達成する

結果を表示する

という流れを作ることが重要です。

今回のまとめ

今回はUnity 6でゲームクリアの仕組みを作りました。

TextMeshProでGameClearTextを作成し、ゲーム開始時には非表示にしています。

ScoreManagerには、

clearScore

gameClearText

CheckGameClear()

を追加しました。

Itemを取得するたびに現在のScoreとClear Scoreを比較し、

score >= clearScore

になった場合に、

gameClearText.gameObject.SetActive(true);

を実行します。

これによって5つのItemをすべて取得すると、画面中央へGAME CLEAR!が表示されるようになりました。

これまで作ってきたPlayer移動、Collider、Item取得、スコア表示がつながり、簡単なゲームの基本ループができました。

次回はゲームクリア後にリスタートできるようにする

現在はGAME CLEAR!が表示されても、そのままPlayerを操作できます。

次回はゲームクリア画面に、

RESTART

ボタンを追加します。

ボタンを押すと現在のSceneを最初から読み込み、

Score: 0

Itemが5個ある状態

からもう一度プレイできるようにします。

ここではUnityのButtonとSceneManagerを使い、ゲームを繰り返し遊べる仕組みを追加していきます。

タイトルとURLをコピーしました