ゲームにおけるステートパターンの実装
ステートパターンの使用例は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;
}