(前回までの内容)条件分岐と状態遷移
状態遷移などの決まったパターン⇒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を作っていく。
コメント