Star☆Unityメモ

Unityのちょっとしたことをメモって後で見返せれたらいいなサイト

Unity:ステート管理(ローグライクを自分なりの解釈で作ってみる)

概要

  1. ゲームの進行を制御したい
  2. 特にすごいことをしているわけではないのでマジで自分用のメモ

イメージ

f:id:zvn_X:20170118124106p:plain

イメージではPlayer→Option→Enemyの順番で行動したい.
なのでPlayerが移動するまではOptionとEnemyは待機,
Option中はEnemyとプレイヤーは待機. そんなイメージ

唯一無二の存在Singleton

ステートの管理を行う場所は一箇所で良い.逆に一箇所でなければなにかと面倒くさい.

そこでSingletonと言うものを利用する.
仕組みはシンプルで,コンストラクタをprivateにすることによって外部からインスタスを作れないようにしてあげます. そして自分自身がインスタンスを生成してstaticとして外部に公開します.これでそのプログラム内で唯一無二のインスタンスを共有することが出来ます.

詳細を知りたい方は下記のリンクへ 5. Singleton パターン | TECHSCORE(テックスコア)

Unityでどう使うの?ってかコードがほしいって人は下記のリンクがおすすめです naichilab.blogspot.jp

ステート管理

管理には唯一無二の存在が適しています.なので今回作成するプログラムはSingletonにします. コレで外部からの操作も可能となります.

ENUM

まず,大体必要になりそうなステートをEnumに記述していきます

public enum GameState {
        None = 0,
        PlayerTurn,
        OptionTurn,
        EnemyTurn,
    }

switchで遷移

nowStateに現在の状態が入力されています

 public GameState nowState = GameState.PlayerTurn;

このnowStateを外部のスクリプトから変更することによって下記のswitch文で処理を遷移させます. 今回はわかりやすいようにOptionTurnステートに移動次第二秒間待機しplayerTurnへ遷移させています.

void Update () {
        
        //ステートの実行
        switch (nowState) {
            case GameState.PlayerTurn:
                Debug.Log("player");
                // プレイヤーが動く
                break;
            case GameState.OptionTurn:
                nowState = GameState.None;
                StartCoroutine("StartOption");
                break;
            case GameState.EnemyTurn:
                //エネミーが移動する
                break;
        }
    }

    IEnumerator StartOption(){
        yield return new WaitForSeconds(2.0f);
        nowState = GameState.PlayerTurn;
    }

このステート管理プログラムをベースに開発を進めていきます