11「玉転がし」Roll a Ball – スコアとテキストの表示

スコアとテキストの表示

収集した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);
        }
    }
}