unity3d 对于游戏设计中的敌方AI状态机,状态本身是否应该评估逻辑以过渡到下一个状态?

polhcujo  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(122)

我正在建立一个敌人的人工智能状态机,在那里我有这些脚本.

设置

  • 敌人
  • 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的例子看起来像是一个典型的例子吗?

jk9hmnmh

jk9hmnmh1#

是的,它是!你知道设计模式吗?它们是你在设计软件时发现的常见问题的通用设计解决方案。这个例子展示了状态模式,用于在运行时控制类的状态并创建内聚状态机。
这里有一个link如果你想知道更多关于它。

相关问题