ゲームエンジン基礎⑧(2025/07/25)

(前回までの内容)条件分岐と状態遷移

状態遷移などの決まったパターン⇒switch文
ゲームの結果などの不定な結果⇒if文
…が向いている。


High or Low

ユーザーに「上か」「下か」を選択させるために、処理をいったん止める。
①状態遷移をさせない(遷移に条件を付ける)
とりあえず、↑カーソルキーが押されたら遷移するように条件を作る。

            case eGameState.GAME_STATE_BATTLE:
                Debug.Log("上か、下か、を決めます。");
                bool inputHigh = Input.GetKeyDown(KeyCode.UpArrow);

                if (inputHigh == true)
                {
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更
                }
                break;

次に↓カーソルが押されても遷移するように条件を作る。

                bool inputLow = Input.GetKeyDown(KeyCode.DownArrow);
                if (inputLow == true)
                {
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更

                }

勝利フラグを作っておき、比較結果によって状態を格納する。

    public bool winFlag = false;    //勝利フラグ(勝ち==true、負け==false)

出目が同じ場合に、状態①に戻る分岐も実装。

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

                if (PlayerDice == RivalDice)
                {
                    //出目が同じ場合に、状態①に戻る
                    GamseState = eGameState.GAME_STATE_NUMFIX_1; 
                }

                bool inputHigh = Input.GetKeyDown(KeyCode.UpArrow);
                if (inputHigh == true)
                {
                    if (PlayerDice > RivalDice)
                    {
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    GameState = eGameState.GAME_STATE_RESULT;   //状態④に変更
                }

                bool inputLow = Input.GetKeyDown(KeyCode.DownArrow);
                if (inputLow == true)
                {
                    if (PlayerDice < RivalDice)
                    {
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    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;

現在の構造だと、一度勝利した場合にFlagがリセットされないため、初期化処理を含める。
初期化処理は、基本的には冒頭に持ってくる。ただし、動作がうまくいかない場合は後処理に含む場合もある。

        switch (GameState)
        {
            case eGameState.GAME_STATE_NUMFIX_1:

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

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

                break;

とりあえず、ゲーム構造の全体

using System.Collections;
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 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;
    }

    // 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);
                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);
                    GameState = eGameState.GAME_STATE_NUMFIX_1; //出目が同じ場合に、状態①に戻る
                }

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

                bool inputLow = Input.GetKeyDown(KeyCode.DownArrow);
                if (inputLow == true)
                {
                    if (PlayerDice < RivalDice)
                    {
                        Debug.Log("Player:"+PlayerDice);
                        winFlag = true;     //勝ちフラグを立てる
                    }
                    else
                    {
                        Debug.Log("Player:"+PlayerDice);
                        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;

        }
    }
}

uGUI(unityGraphicalUserInterface)

Debug.Logはユーザーには見えないので、構造を組んだ後に見た目を整えていく。

UnityのUIは、HierarchyメニューのUIにすべて格納されている。

※TextMeshPro:Unityのテキスト表示機能。日本語表示はデフォルトでは非対応。
Legacy内には、Textという機能もあり、こちらはデフォルトで日本語対応。ただし画質荒い

UI>Text を選択すると EventSystem、Canvas、Canvas配下にTextが配置される。

EventSystem:
Canvas:

Canvas >CanvasScaler >UI Scale Mode
で、まずスケールを固定する。(ConstantPixcelSize ⇒ ScaleWithScreenSize)

Text(TMP)の設定を見ていく

※RectTranseformは”pixel”サイズ。ほかは”meter”サイズ。

※文字を大きくするには
 scaleで大きくする方法
 fontsizeで大きくする方法
があるが、fontsizeの方が無難。scaleで拡大すると、ぼやけたりもする。

Imageの設定を見ていく
RaycastTarget:☑が入ってると、ボタンなどに重ねた際に、下にあるボタンは押せなくなる。


Input.~
様々な入力を受けることができるので、試してみるべし。

※Unityでの制作手法
・ゲームの流れを管理するスクリプトを作って、そこで管理する方法
・オブジェクトにスクリプトを張り付けて作っていく方法
など、いろいろある。

次回、UIを作っていく。

コメント

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