スコアとテキストの表示
収集したPickUpゲームオブジェクトの数を保持できるようにPlayerController.csを修正します。また、収集数とゲーム終了メッセージを表示するUIを構築します。
収集したPickUpゲームオブジェクトの数を保存
PlayerControllerでcount変数を宣言し、プレイヤーがPickUpゲームオブジェクトを収集するたびに1ずつ増加させます。
1. count変数の宣言
PlayerController.csを開きます。
整数型のcount変数をprivateで宣言します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
private float _movementY;
+
+ private int _count;
...(省略)
}
2. count変数の初期化
Start関数内でcount変数を0に初期化します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void Start()
{
_rb = GetComponent<Rigidbody>();
+ _count = 0;
}
...(省略)
}
3. PickUpゲームオブジェクトに接触時count変数の値を増やす
OnTriggerEnter関数内で、他のゲームオブジェクトを非アクティブに設定した後にcount変数の値を1増やすコードを追加します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
+ _count = _count + 1;
}
}
}
UIテキスト要素の作成
CountTextという名前のテキストゲームオブジェクトを追加し、テキスト位置を編集します。
1. CountTextという名前のテキストゲームオブジェクトを追加
Hierarchyビューで「右クリック > UI > Text – TextMeshPro」の順番で選択します。
TMP Importerという名前のウィンドが開くので「Import TMP Essentials」を選択してください。
その後、TMP Importerのウィンドは終了してください。

Text(TMP)ゲームオブジェクトの名前を「CountText」に変更してください。

2. キャンバス全体を2Dビューでプレビュー
HierarchyビューのCanvasゲームオブジェクトを選択しFキーを押してください。
Sceneビューの上部にある2D Toggleを選択し、2Dビューに変更します。

3. テキストを編集
HierarchyビューのCountTextゲームオブジェクトを選択します。
InspectorビューのTextMeshPro – Text(UI)コンポーネントに表示されているテキストボックスの「New Text」を削除し、「Count Text」と入力してください。

4. テキストの位置を編集
InspectorビューのRect Transormコンポーネントの上部にあるAnchor Presetアイコンを選択肢してメニューを開きます。

Shift + Altキー(MacOS: Optionキー)を押しながら左上のアンカーポイントを選択肢します。これらのキーを押したままにすると、アンカーに基づいてCountTextのピボットと位置が設定されます。

Rect TransformコンポーネントのPosを(X: 10, Y: -10)に変更して角から少し離します。

収集数を表示
PlayerController.csにCountTextのテキストを更新するSetCountText()関数を作成します。
1. TMProライブラリをインポート
PlayerController.csを開きます。
TMProをusingで追加します。
PlayerController.cs
using UnityEngine;
using UnityEngine.InputSystem;
+ using TMPro;
public class PlayerContrller : MonoBehaviour
{
...(省略)
}
2. countText変数の宣言
countText変数を宣言します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
private int _count;
+
+ public TextMeshProUGUI countText;
...(省略)
}
3. SetCountText()関数の作成
SetCountText()関数を追加します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void OnTriggerEnter(Collider other)
{
...(省略)
}
+
+ void SetCountText()
+ {
+ countText.text = "Count: " + _count.ToString();
+ }
}
4. Start関数とOnTriggerEnterでSetCountTextを呼び出す
ゲーム開始時のテキストを設定するために、Start関数内でSetCountText関数を呼び出します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void Start()
{
_rb = GetComponent<Rigidbody>();
_count = 0;
+ SetCountText();
}
...(省略)
}
OnTriggerEnter関数のif文の中で、SetCountText関数を再度呼び出します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PickUp"))
{
other.gameObject.SetActive(false);
_count = _count + 1;
+ SetCountText();
}
}
...(省略)
}
5. InspectorビューでCountTextを変数に割当
HierarchyビューでPlayerゲームオブジェクトを選択し、InspectorビューのPlayerControllerコンポーネントのCountTextスロットにHierarchyビューのCountTextをドラッグ&ドロップします。

※この手順を実行しないとエラーが表示され、ゲームが動作しなくなります。
6. ゲームテスト
Countは1から始まり、プレイヤーがPickUpゲームオブジェクトに触れる旅に1ずつ増加することを確認してください。
ゲーム終了メッセージの作成
すべてのPickUpゲームオブジェクトを収集すると「You Win」テキストを表示する処理を作成します。
1. WinTextという名前のテキストゲームオブジェクトの作成
Hierarchyビューで「右クリック> UI > Text – TextMeshPro」の順番で選択し、名前を「WinText」に変更します。
HierarchyビューでWinTextゲームオブジェクトを選択し、InspectorビューのTextMeshoPro – Text(UI)コンポーネントのテキストを「You Win!」に変更します。
TextMeshoPro – Text(UI)コンポーネントのVertex Colorを黒に、AlignmentをCenter(左から2番め)に、Font Sizeを32に設定しFont StyleをBold(B)に設定します。
Rect Transormコンポーネントの上部にあるAnchor Presetアイコンを選択肢してメニューを開きます。
Shift + Altキー(MacOS: Optionキー)を押しながら中央のアンカーポイントを選択肢します。
Rect TransformコンポーネントのPosを(X: 0, Y: 100)に設定します。

2. WinText用の変数の宣言
PlayerController.csを開きます。
WinTextを保持する変数winTextObjectを宣言します。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
public TextMeshProUGUI countText;
+
+ public GameObject winTextObject;
...(省略)
}
Start関数内で、ゲーム開始時はWinTextゲームオブジェクトを非表示するようにします。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void Start()
{
_rb = GetComponent<Rigidbody>();
_count = 0;
SetCountText();
+ winTextObject.SetActive(false);
}
...(省略)
}
3. PickUpゲームオブジェクトがすべて収集されたときにWinTextを表示
SetCountText関数内ですべてのPickUpゲームオブジェクトを収集したらという条件のif文を追加しWinTextゲームオブジェクトを表示させるようにします。
PlayerController.cs
...(省略)
public class PlayerContrller : MonoBehaviour
{
...(省略)
void SetCountText()
{
countText.text = "Count: " + _count.ToString();
+
+ if (_count >= 12)
+ {
+ winTextObject.SetActive(true);
+ }
}
}
※「12」は、ゲーム何に実際に存在するPickUpゲームオブジェクトの数に変更してください。
4. InspectorビューでWinTextを変数に割当
HierarchyビューのPlayerゲームオブジェクトを選択します。
InspectorビューのPlayerControllerゲームオブジェクトのWin Text ObjectスロットにHierarchyビューのWinTextをドラッグ&ドロップします。

5. ゲームテスト
Sceneを保存します。
すべてのPickUpゲームオブジェクトを収集すると「You Win!」が表示されることを確認してください。
最終スクリプト
PlayerController.cs
using UnityEngine;
// PlayerゲームオブジェクトにアタッチしたPlayerInputからの入力を受け付けるために必要な名前空間
// キーボード/ゲームパッド → Actions(ProjectビューにあるInputSystem_Actionsファイル) →
// PlayerゲームオブジェクトにアタッチしたPlyaerInput → このスクリプト
using UnityEngine.InputSystem;
using TMPro;
public class PlayerContrller : MonoBehaviour
{
/// <summary>
/// Playerの移動速度を保存する変数
/// </summary>
public float speed = 5f;
// private(プライベート)で定義する変数の名前は最初に_(アンダーバー)を付けます。
// private変数は他のスクリプトファイルから値を取得・変更させることができない変数です。
/// <summary>
/// PlayerにアタッチされたRigidbodyを保存する変数
/// </summary>
private Rigidbody _rb;
/// <summary>
/// X方向の移動量を保存する変数
/// </summary>
private float _movementX;
/// <summary>
/// Y方向の移動量を保存する変数
/// </summary>
private float _movementY;
/// <summary>
/// 収集されたPickUpゲームオブジェクトの数を保存する変数
/// </summary>
private int _count;
/// <summary>
/// 収集されたPickUpゲームオブジェクトの数を表示するUIテキストコンポーネント
/// </summary>
public TextMeshProUGUI countText;
/// <summary>
/// WinTextを表示するゲームオブジェクト
/// </summary>
public GameObject winTextObject;
void Start()
{
// PlayerにアタッチされたRigidbodyを取得し変数_rbに保存します。
_rb = GetComponent<Rigidbody>();
// ゲーム開始時に_countを0に初期化します。
_count = 0;
// カウント表示を更新します。
SetCountText();
// ゲーム開始時にWinTextを非アクティブに設定します。
winTextObject.SetActive(false);
}
/// <summary>
/// プレイヤーのキーボード(WASD)/ゲームパッド(Lスティック)の入力があった際に呼び出される関数です。
/// </summary>
/// <param name="movementValue">入力デバイスのX方向とY方向の値を持っています。</param>
void OnMove(InputValue movementValue)
{
// Vecotr2(2次元座標:X座標/Y座標)型の変数movementVecotrにmovementValueをVector2(2次元座標)に変換し保存します。
Vector2 movementVector = movementValue.Get<Vector2>();
// movementVectorのX座標・Y座標をそれぞれに変数に保存します。
_movementX = movementVector.x;
_movementY = movementVector.y;
}
void FixedUpdate()
{
// _movmentXをX軸の値に_movmentYをZ軸の値にした3次元座標に変換し変数momventに保存します。
Vector3 movement = new Vector3(x: _movementX, y: 0.0f, z: _movementY);
// RigidbodyのAddFrouce関数に3次元座標を渡し、指定した方向に力を加えます。
// movment(力)にspeed(移動速度)掛け合わせます。
_rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
// プレイヤーが衝突したオブジェクトにPickUpタグが付いているか確認します。
if (other.gameObject.CompareTag("PickUp"))
{
// 衝突したオブジェクトを非アクティブ化します。(非表示になる)
other.gameObject.SetActive(false);
// _countの数を1増やします。
_count = _count + 1;
// カウント表示を更新します。
SetCountText();
}
}
/// <summary>
/// 収集されたPickUpゲームオブジェクトの表示数を更新する関数です。
/// </summary>
void SetCountText()
{
// 現在の数でCountTextのテキストを更新します。
countText.text = "Count: " + _count.ToString();
// カウント数が勝利条件に達したかを確認します。
if (_count >= 12)
{
// WinTextゲームオブジェクトを表示します。
winTextObject.SetActive(true);
}
}
}