游戏AI - 行为树

时间:2012-04-27 20:19:37

标签: xna artificial-intelligence

如何为游戏制作强大的AI /脚本系统?

1)对于所有NPC的/环境/实体,您是否给它们一个单独的行为树(等等patrolBehavior,allyBehavior,vendorBehavior,doorBehavior)?如果屏幕上有500个单元,我应该在树上进行完整传递(从root - >节点/动作开始)还是应该为所有单元进行单节点进度?

2)我正在做update()函数中的AI逻辑...但我听说有些游戏有自己独立的AI线程,有什么想法吗?

3)我想知道如何将我的游戏分成几个部分/章节......我是否使用一个简单的变量(EVENT =“Mission 3”)来表示玩家的表现如何,并使它全部线性?然后在上面的树中使用变量?

2 个答案:

答案 0 :(得分:6)

我会尽力回答你的问题。

  1. 我在静态类中执行所有分支逻辑和行为树,例如:

     public static class Behavior
    {
        //Branch
        public static Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) {
            return () => { if (cond()) { ifTrue(); } else { ifFalse(); } };
            }
        public static Action Sequencer(Action a, Action b) {
              return () => { a(); b(); }
            }
    
        //Example trees
        public static Func<bool> ifPlayerIsInSight = () => { return true; /*...true iff WorldState shows guard can see player...*/};
    
        public static Action shootAtPlayer = () => { /*...aim guard's weapon at player and fire...*/ };
    
        public static Func<bool> ifUnderFire = () => { return true; /*...true iff WorldState shows guard hears player gunfire...*/};
    
        public static Action takeCover = () => { /*...guard runs for nearest shelter... */};
    
        public static Action walkBackAndForthGuardingDoorway = () => { /*...default guard patrol behaviour...*/ };
    
        public static Action patrollingGuardBehaviour =
          Selector(Behavior.ifPlayerIsInSight, Behavior.shootAtPlayer,
            Selector(Behavior.ifUnderFire, Behavior.takeCover,
              Behavior.walkBackAndForthGuardingDoorway));
    }
    
    1. 在LateUpdate()或last中执行此操作,使其不会滞后于主循环。

    2. 这取决于你。您可以在每个行为树中实现“状态”,或将其拆分出来并管理在什么时间使用哪个。

答案 1 :(得分:0)

  1. 每个NPC / Agent都有自己的行为树。树被更新并且它知道&#39;哪里继续,所以效率通常都很好。
  2. AIs可以在主线程中更新,也可以在分离的thead中更新。这取决于你自己。
  3. 这取决于你自己。
  4. behaviac非常出色。

    behaviac支持行为树,有限状态机和分层任务网络。行为可以在设计师中设计和调试,由游戏导出和执行。

    C ++版本适用于客户端和服务器端。

    并且,它是开源的!