dskjal
広告
広告

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

カテゴリ: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;

}


広告
広告

カテゴリ