ゲームエンジン基礎⑨(2025/08/28)

uGUI
・TextMeshPro ※ver2019頃実装。検索時には”TextMeshPro”で行う。
・Button
・Image
Script(参照に使う関数)
・GameObject.Find ※
・GetComponent   ※

Hierarchy(右クリック)⇒UI 配下が部品。

・Unityでの「入力」は「UI」を使わないとできない(Input等の標準入力は使えない)
・UIのオブジェクトは「Canvas」配下に配置しないと表示されない
・「EventSystem」が自動生成されるが、これは消去しないこと。

・TextMeshPro
デフォルトでは日本語非対応
フォントデータからアセットを作成することは可能

●TextMeshProのいじり方
テキストを、ゲーム進行に応じて「変更する」場合に「参照」が必要になる。

publicで変数を作るとInspectorに表示される…publicで変数を作ると参照が可能
変数宣言時にコンポーネントの型を記載すればOK
ただし…TextMeshProの場合「TextMeshProUGUI」が型名になるので注意。

●TextMeshProコンポーネント型の変数を宣言 ⇒ Inspectorの変数名の欄にObjectをドロップ
※.csファイル側の冒頭に”using TMPro;”の記載が必要

using TMPro;
~~~~~~~~~~~~~~~~~~~~~~~~~~
    public TextMeshProUGUI rivalDiceText;
    public TextMeshProUGUI playerDiceText;
~~~~~~~~~~~~~~~~~~~~~~~~~~
void Start()
    {
        // 状態①から開始
        GameState = eGameState.GAME_STATE_NUMFIX_1;

        rivalDiceText.text = "0";
        playerDiceText.text = (0+2).ToString();
    }

これで、代入した数字が表示されるようになる。
ダイス目の初期値を表示できるようにしてみる。

    void Start()
    {
        // 状態①から開始
        GameState = eGameState.GAME_STATE_NUMFIX_1;

        rivalDiceText.text = RivalDice.ToString();
        playerDiceText.text = PlayerDice.ToString();
    }

※この方法で参照できるのは、Scene上に存在するオブジェクトか、Asset上のものに限る。
 途中で生成されたオブジェクトは参照できない。

とりあえずTextを適宜配置。
コードも修正

using System.Collections;
using TMPro;
using Unity.Burst.Intrinsics;
using UnityEngine;

// ゲームの管理クラス
public class GameManager : MonoBehaviour
{
    // メンバー変数を宣言
    public enum eGameState
    {
        GAME_STATE_NUMFIX_1,
        GAME_STATE_NUMFIX_2,
        GAME_STATE_BATTLE,
        GAME_STATE_RESULT,
    }

    public TextMeshProUGUI rivalDiceText;
    public TextMeshProUGUI playerDiceText;

    public eGameState GameState;

    public int PlayerDice = 0;  //プレイヤーの出目を保存する変数
    public int RivalDice = 0;   //相手の出目を保存する変数
    public bool winFlag = false;    //勝利フラグ(勝ち==true、負け==false)

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        // 状態①から開始
        GameState = eGameState.GAME_STATE_NUMFIX_1;

        rivalDiceText.text = RivalDice.ToString();
        playerDiceText.text = PlayerDice.ToString();
    }

    // Update is called once per frame
    void Update()
    {
        switch (GameState)
        {
            case eGameState.GAME_STATE_NUMFIX_1:

                //勝ちフラグをリセットしてから始める
                winFlag = false;

                RivalDice = Random.Range(1, 6);             // 相手の出目にランダムな値(1~6)を代入
                Debug.Log("相手の出目を決めます。1~6>>>"+ RivalDice);
                rivalDiceText.text = RivalDice.ToString();  //出目を表示(ライバル)
                playerDiceText.text = "??";
                GameState = eGameState.GAME_STATE_NUMFIX_2; // 状態②に変更

                break;

            case eGameState.GAME_STATE_NUMFIX_2:
                Debug.Log("自分の出目を決めます。1~6");
                PlayerDice = Random.Range(1, 6);            //自分の出目にランダムな値(1~6)を代入 
                GameState = eGameState.GAME_STATE_BATTLE;   //状態③に変更
                break;

            case eGameState.GAME_STATE_BATTLE:
                Debug.Log("上か、下か、を決めます。");

                if (PlayerDice == RivalDice)
                {
                    Debug.Log("Player:"+PlayerDice+"Rival:"+RivalDice);
                    playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                    GameState = eGameState.GAME_STATE_NUMFIX_1; //出目が同じ場合に、状態①に戻る
                }

                bool inputHigh = Input.GetKeyDown(KeyCode.UpArrow);
                if (inputHigh == true)
                {
                    if (PlayerDice > RivalDice)
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    else
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = false;    //勝ちフラグを折る
                    }
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更
                }

                bool inputLow = Input.GetKeyDown(KeyCode.DownArrow);
                if (inputLow == true)
                {
                    if (PlayerDice < RivalDice)
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    else
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = false;    //勝ちフラグを折る
                    }
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更

                }
                break;

            case eGameState.GAME_STATE_RESULT:
                Debug.Log("結果を表示します");
                if (winFlag == true)
                {
                    Debug.Log("YouWin!");
                }
                else
                {
                    Debug.Log("YouLose!");
                }
                GameState = eGameState.GAME_STATE_NUMFIX_1; //状態①に戻る

                break;

            default:
                break;

        }
    }
}

なお、授業進行的には、ユーザーの出目は
playerDiceText.gameObject.SetActive(false);
で隠している(オブジェクト自体を非アクティブにできる)。
(オブジェクト名).gameObject.SetActive(true/false);で、オブジェクトを表示したり、非表示にしたり切り替えが可能。

Win/Loseも追加してみる。(TextMeshPro(result)を作成して宣言。アタッチも忘れずに。)

using System.Collections;
using NUnit.Framework.Interfaces;
using TMPro;
using Unity.Burst.Intrinsics;
using UnityEngine;

// ゲームの管理クラス
public class GameManager : MonoBehaviour
{
    // メンバー変数を宣言
    public enum eGameState
    {
        GAME_STATE_NUMFIX_1,
        GAME_STATE_NUMFIX_2,
        GAME_STATE_BATTLE,
        GAME_STATE_RESULT,
    }

    public TextMeshProUGUI rivalDiceText;
    public TextMeshProUGUI playerDiceText;
    public TextMeshProUGUI resultText;

    public eGameState GameState;

    public int PlayerDice = 0;  //プレイヤーの出目を保存する変数
    public int RivalDice = 0;   //相手の出目を保存する変数
    public bool winFlag = false;    //勝利フラグ(勝ち==true、負け==false)

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        // 状態①から開始
        GameState = eGameState.GAME_STATE_NUMFIX_1;

        rivalDiceText.text = RivalDice.ToString();
        playerDiceText.text = PlayerDice.ToString();
    }

    // Update is called once per frame
    void Update()
    {
        switch (GameState)
        {
            case eGameState.GAME_STATE_NUMFIX_1:

                //勝ちフラグをリセットしてから始める
                winFlag = false;

                RivalDice = Random.Range(1, 6);             // 相手の出目にランダムな値(1~6)を代入
                Debug.Log("相手の出目を決めます。1~6>>>"+ RivalDice);
                rivalDiceText.text = RivalDice.ToString();  //出目を表示(ライバル)
                playerDiceText.text = "??";
                GameState = eGameState.GAME_STATE_NUMFIX_2; // 状態②に変更

                break;

            case eGameState.GAME_STATE_NUMFIX_2:
                Debug.Log("自分の出目を決めます。1~6");
                PlayerDice = Random.Range(1, 6);            //自分の出目にランダムな値(1~6)を代入 
                GameState = eGameState.GAME_STATE_BATTLE;   //状態③に変更
                break;

            case eGameState.GAME_STATE_BATTLE:
                Debug.Log("上か、下か、を決めます。");

                if (PlayerDice == RivalDice)
                {
                    Debug.Log("Player:"+PlayerDice+"Rival:"+RivalDice);
                    playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                    GameState = eGameState.GAME_STATE_NUMFIX_1; //出目が同じ場合に、状態①に戻る
                }

                bool inputHigh = Input.GetKeyDown(KeyCode.UpArrow);
                if (inputHigh == true)
                {
                    if (PlayerDice > RivalDice)
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    else
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = false;    //勝ちフラグを折る
                    }
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更
                }

                bool inputLow = Input.GetKeyDown(KeyCode.DownArrow);
                if (inputLow == true)
                {
                    if (PlayerDice < RivalDice)
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    else
                    {
                        Debug.Log("Player:"+PlayerDice);
                        playerDiceText.text = PlayerDice.ToString(); //出目を表示(ユーザー)
                        winFlag = false;    //勝ちフラグを折る
                    }
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更

                }
                break;

            case eGameState.GAME_STATE_RESULT:
                Debug.Log("結果を表示します");
                if (winFlag == true)
                {
                    Debug.Log("YouWin!");
                    resultText.color = new Color(255, 0, 0);
                    resultText.text = "You Win!!";
                }
                else
                {
                    Debug.Log("YouLose!");
                    resultText.color = new Color(0, 0, 255);
                    resultText.text = "You Lose!!";
                }

                if (Input.GetKeyDown(KeyCode.Return))
                {

                    GameState = eGameState.GAME_STATE_NUMFIX_1; //状態①に戻る
                    resultText.color = new Color(255, 255, 255);
                    resultText.text = "";
                }
                break;

            default:
                break;

        }
    }
}


コメント

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