コンテンツにスキップ

State

状態ごとの振る舞いをオブジェクトへ分離し、状態遷移に応じて動作を切り替えるパターンです。

  • プレイヤー移動や戦闘状態が増えていくとき
  • if-else による状態分岐が肥大化するとき
  • Context
  • State Interface
  • Concrete State

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

public interface ICharacterState
{
void Tick(PlayerStateMachine stateMachine);
}
public sealed class IdleState : ICharacterState
{
public void Tick(PlayerStateMachine stateMachine)
{
if (stateMachine.MoveInput > 0f)
{
stateMachine.ChangeState(new RunState());
}
}
}
public sealed class RunState : ICharacterState
{
public void Tick(PlayerStateMachine stateMachine)
{
if (stateMachine.MoveInput <= 0f)
{
stateMachine.ChangeState(new IdleState());
}
}
}
  • 振る舞いを分離できるため、変更の影響範囲を小さくできます。
  • ルールの追加や差し替えを比較的安全に行えます。
  • オブジェクト数や間接呼び出しが増えると、流れを追いにくくなります。
  • 実行順序のバグはテストで固定しておく必要があります。

コンテキストが現在状態オブジェクトへ処理を委譲し、状態遷移を行う流れです。

State の流れ