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

问题描述 投票:0回答:1

我正在构建一个 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 的例子看起来是一个典型的例子吗?

unity3d design-patterns artificial-intelligence state-machine state-pattern
1个回答
0
投票

是的,是的!你了解设计模式吗?它们是您在设计软件时发现的共同问题的共同设计解决方案。此示例显示状态模式,用于在运行时控制类的状态并创建内聚状态机。

如果您想了解更多信息,请点击链接

© www.soinside.com 2019 - 2024. All rights reserved.