広告
広告

ゲームにおけるステートパターンの実装

カテゴリ:unity

ステートパターンの使用例はGame Programming Patterns Stateで解説されている。リンク先の例では操作キャラクターの状態(立ち・しゃがみ・ジャンプ・ダイブ)を FSM とステートパターンとで実装して比較している。

しかしリンク先ではいちいちステートを new しており非効率的だ(ステートに初期化処理がなかったとしても)。ステートの数が固定なら、テーブルを利用することでステート変更時のコストを削減できる。

enum PlayerStateEnum{
    Stand = 0,
    Duck,
    Jump,
    Dive,
    NumPlayerState
};

abstruct class PlayerState{
    public abstruct PlayerStateEnum Update();
}

class StandState : PlayerState{
    public override PlayerStateEnum Update(){
        if( Input.GetKey(KeyCode.DownArrow) ){
            return PlayerStateEnum.Duck;
        }
        if( Input.GetKey(KeyCode.UpArrow) ){
            return PlayerStateEnum.Jump;
        }

        return PlayerStateEnum.Stand;
    }
}

// 他のステートも同様に定義する
class DuckState : PlayerState{
// ...

class Player{
    public void Initialize(){
        stateTable[0] = new StandState();
        stateTable[1] = new DuckState();
        // 他のステートも同様に初期化する

        currentState = stateTable[0];
    }

    public void Update(){
        currentState = stateTable[ currentState.Update() ];
    }

    private PlayerState[] stateTable = new PlayerState[NumPlayerState];
    private PlayerState currentState;
}

広告
広告