我正在建立一个敌人的人工智能状态机,在那里我有这些脚本.
设置
- 敌人
- EnemyStateManager
- EnemyStateBase
国家 - 初始状态
- 漫游状态
- 追踪状态
- 攻击状态
- 撤退状态
当我在一个敌对状态中时,比如说追击状态,敌人的角色是追逐目标,直到它进入攻击范围。我不确定我是否应该在状态中编程敌人的决策过程,或者有一个单独的脚本,将调用当前状态的动作,并且状态中继该动作是否可以在状态中执行。
目前,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
}
非AI情况
如果我根据参与者的输入来构建一个状态机,那么参与者就是决策者,输入被转发到状态机,状态机将根据我的输入做出适当的响应。
摘要
敌人AI的例子似乎AI输入来自状态本身,而在传统的玩家输入设置中,它来自状态机之外。敌人AI的例子看起来像是一个典型的例子吗?
1条答案
按热度按时间jk9hmnmh1#
是的,它是!你知道设计模式吗?它们是你在设计软件时发现的常见问题的通用设计解决方案。这个例子展示了状态模式,用于在运行时控制类的状态并创建内聚状态机。
这里有一个link如果你想知道更多关于它。