ステートマネージャーの作成
メニューを表示するにはスワイプしてください
ステート:
public abstract class State
{
public abstract void StartState();
public virtual void UpdateState()
{
}
public abstract void EndState();
}
抽象メソッド:
public abstract void StartState();
public abstract void EndState(); は抽象メソッド。
抽象メソッドはここでは本体(実装)を持たず、この State クラスを継承する非抽象クラスで必ず実装する必要あり。
仮想メソッド:
public virtual void UpdateState() {} は仮想メソッド。
仮想メソッドは実装(この場合は空の本体 {})を持つが、派生クラスで異なる動作が必要な場合はオーバーライド可能。
敵キャラクターにおける動作
ステートの継承:
State クラスは他の具体的なステートによって継承される。例えば、IdleState、AttackState、PatrolState などのクラスが State を継承する。
これら各ステートは、それぞれ独自の StartState()、UpdateState()、EndState() を実装する。
敵の挙動:
敵の挙動は状態によって管理され、StartState()で状態の初期化、UpdateState()で状態中の挙動更新、EndState()で状態終了後の後処理を行う。
抽象クラスの利用:
Stateを抽象クラスにすることで、すべての具体的な状態が必要なメソッドを実装することを保証し、敵の挙動を整理し、敵スクリプトを変更せずに状態管理を簡素化できる。
ステートマネージャー:
public class StateManager
{
State currentState;
public StateManager(State startingState)
{
currentState = startingState;
currentState.StartState();
}
public void ChangeState(State newState)
{
currentState.EndState();
currentState = newState;
currentState.StartState();
}
public void UpdateStates()
{
currentState.UpdateState();
}
}
説明
コンストラクター public StateManager(State startingState) は、StateManager を開始状態で初期化します。currentState を startingState に設定し、currentState.StartState() を呼び出して初期化します。
ChangeState メソッド、public void ChangeState(State newState) は敵の状態を変更します。現在の状態の後処理として currentState.EndState() を呼び出し、currentState を新しい状態に設定し、currentState.StartState() を呼び出して新しい状態を初期化します。
UpdateStates メソッド、public void UpdateStates() は、currentState.UpdateState() を呼び出して現在の状態を更新し、その状態に関連する処理を実行します。
敵キャラクターにおける動作
敵キャラクター用に StateManager を作成すると、コンストラクターが開始状態を初期化します。敵の行動を変更する必要がある場合、ChangeState メソッドが呼び出され、EndState() で現在の状態を終了し、新しい状態を設定し、StartState() で初期化します。ゲーム中は UpdateStates メソッドが繰り返し呼び出され、UpdateState() を通じて現在の状態のアクションが実行されます。
ワークフロー例:
敵キャラクターは IdleState から開始し、StateManager が作成されて IdleState.StartState() が呼び出され、待機動作が設定されます。敵がプレイヤーを検知すると、ChangeState(new AttackState()) が呼び出され、IdleState.EndState() で待機動作が終了します。現在の状態が AttackState に設定され、AttackState.StartState() で攻撃動作が開始されます。
毎フレーム UpdateStates() が呼び出され、現在の状態が AttackState の場合、AttackState.UpdateState() が攻撃アクションを処理します。
StateManager クラスを使用することで、敵キャラクターのさまざまな行動を整理された形で簡単に管理・切り替えできます。
待機状態(Idle State)
public class IdleState : State
{
Animator animator;
public IdleState(Animator animator)
{
this.animator = animator;
}
public override void StartState()
{
animator.SetBool("idle", true);
}
public override void EndState()
{
animator.SetBool("idle", false);
}
}
解説
コンストラクタ public IdleState(Animator animator) は Animator オブジェクトをパラメータとして受け取り、クラスの animator 変数に代入。StartState メソッド(public override void StartState())は、アニメーター内の "idle" ブールパラメータを true に設定し、待機アニメーションを開始。EndState メソッド(public override void EndState())は、"idle" パラメータを false に設定し、待機アニメーションを停止。
敵キャラクターにおける動作
敵が IdleState に入ると、StartState() メソッドがアニメーターの "idle" パラメータを true に設定し、待機アニメーションが開始され、敵が待機しているように見える。敵が IdleState から離れると、EndState() メソッドが "idle" パラメータを false に設定し、待機アニメーションを停止。これにより、敵は移動や攻撃など他の状態へ遷移する準備が整う。
例:ワークフロー
StateManager は敵の状態を IdleState に設定し、IdleState.StartState() を呼び出してアニメーターの「idle」パラメータを true に設定し、待機アニメーションを開始します。敵の挙動を変更する際、StateManager は IdleState.EndState() を呼び出して「idle」パラメータを false に設定し、待機アニメーションを停止します。その後、StateManager は敵を AttackState や PatrolState などの新しい状態へ遷移させます。
IdleState クラスを使用することで、敵がスムーズに待機状態へ入り、また抜けることができ、より動的かつリアルな挙動を実現できます。この構造により、敵の待機挙動を他のコード部分に影響を与えずに追加・修正することも容易になります。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください