Xna 游戏AI-行为树

Xna 游戏AI-行为树,xna,artificial-intelligence,behavior-tree,Xna,Artificial Intelligence,Behavior Tree,如何为游戏制作一个健壮的AI/脚本系统 1)对于所有NPC/environment/entities,您是否为其提供单独的单一行为树(例如patrolBehavior、allyBehavior、vendorBehavior、doorBehavior)?如果屏幕上有500个单位,我应该在树上做一个完整的过程(从根->节点/操作),还是应该对所有单位进行单节点进度 2)我正在更新()函数中执行AI逻辑。。。但我听说有些游戏有各自的AI线程,有什么想法吗 3)我想知道如何将我的游戏划分为几个部分/章节

如何为游戏制作一个健壮的AI/脚本系统

1)对于所有NPC/environment/entities,您是否为其提供单独的单一行为树(例如patrolBehavior、allyBehavior、vendorBehavior、doorBehavior)?如果屏幕上有500个单位,我应该在树上做一个完整的过程(从根->节点/操作),还是应该对所有单位进行单节点进度

2)我正在更新()函数中执行AI逻辑。。。但我听说有些游戏有各自的AI线程,有什么想法吗


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

我将尝试回答您的问题

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

     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));
    }
    
    公共静态类行为
    {
    //分支机构
    公共静态操作选择器(funct-cond、Action-ifTrue、Action-ifFalse){
    return()=>{if(cond()){ifTrue();}else{ifFalse();};
    }
    公共静态动作定序器(动作a、动作b){
    return()=>{a();b();}
    }
    //示例树
    公共静态函数ifPlayerIsInSight=()=>{return true;/*…true iff WorldState显示守卫可以看到玩家…*/};
    公共静态动作射击玩家=()=>{/*…将守卫的武器瞄准玩家并开火…*/};
    公共静态函数ifUnderFire=()=>{返回真;/*…真iff WorldState显示守卫听到玩家枪声…*/};
    公共静态动作takeCover=()=>{/*…守卫跑向最近的避难所…*/};
    公共静态动作walkback和forthguardingdouthood=()=>{/*…默认警卫巡逻行为…*/};
    公共静态行动巡逻警卫行为=
    选择器(Behavior.ifPlayerIsInSight、Behavior.shootAtPlayer、,
    选择器(Behavior.ifUnderFire、Behavior.takeCover、,
    行为。回退和守卫门口);
    }
    
  • 在LateUpdate()或last中执行此操作,这样它就不会滞后于主循环

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

  • 每个NPC/代理都有自己的行为树。树被更新,它“知道”在哪里继续,所以效率通常是相当好的
  • AIs可以在主线程中更新,也可以在单独的线程中更新。这取决于你自己
  • 这取决于你自己
  • 这是一个非常好的例子

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

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


    而且,它是开源的

    这是一个非常广泛的问题。如果您开始实施您的AI系统,或者开始阅读,然后带着特定的技术问题回来,您可能会得到更好的答案。通过阅读源引擎AI系统的工作原理,您还可以学到很多东西: