我正在构建一个 Enemy AI 状态机,我有这些脚本。
设置
州
当我处于敌方状态时,比如说追逐状态,敌人的作用是追逐目标直到其攻击范围内。我不确定我是否应该在状态内对敌人的决策过程进行编程,或者有一个单独的脚本来调用当前状态的动作,并且状态中继该动作是否可以在状态内进行。
目前,EnemyStateManager 是这样设置的。
public class StateMachine : MonoBehaviour {
private EnemyStateBase _currentState;
private Enemy _enemy;
public Enemy Enemy { get => _enemy; set => _enemy = value; }
private void Start() {
_currentState = new RoamingState(this);
}
public void ChangeState(State newState) {
_currentState.ExitState();
_currentState = newState;
_currentState.EnterState();
}
public void Update(){
_currentState.UpdateState();
}
}
在下面你看到我处于追击状态并检查我是否在攻击范围内的更新。尝试评估状态内的 AI 逻辑感觉很奇怪,但如果这看起来像一种常见的做法并遵循编码指南,那么我想我担心的是白费心。
public class PursuingState : EnemyStateBase {
private EnemyStateManager _esm;
public PursuingState (EnemyStateManager esm){
_esm = esm;
}
public override void EnterState() {
// Do something when entering the pursuing state
}
public override void UpdateState() {
// Check To See If you Entered Attack Range with target
var targetPos = _esm.Enemy.Target.Transform.Position;
var myPos = _esm.Enemy.Transform.Position;
if(Vector3.Difference(mypos, targetpos) < _esm.Enemy.AttackRange){
_esm.ChangeState(new AttackState(_esm));
}
}
public override void ExitState() {
// Do something when exiting the pursuing state
}
如果我要构建一个来自玩家输入的状态机,那么玩家就是决策者,输入被中继到状态机,状态机将根据我的输入做出适当的反应。
Enemy AI 示例似乎 AI 输入来自状态本身,而在具有玩家输入的传统设置中,它来自状态机外部。 Enemy AI 的例子看起来是一个典型的例子吗?
是的,是的!你了解设计模式吗?它们是您在设计软件时发现的共同问题的共同设计解决方案。此示例显示状态模式,用于在运行时控制类的状态并创建内聚状态机。
如果您想了解更多信息,请点击链接。