zoukankan      html  css  js  c++  java
  • 游戏AI技术 2

    Unity3D人工智能编程精粹 2

    1、跟随领队行为。

      用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好。在Seek中,AI角色会被推向领队,最终与领队占据相同位置。而Pursuit也是一样的问题。

      在跟随领队中,目标是接近领队,但稍微落后。当角色距离 领队较远时,可能会较快地移动,当距离 领队较近时,会减慢速度。

      1)跟随点可以设置为领队身后一段距离。针对跟随点,应用Arrive。

      

      

      2)当AI角色挡住领队前方路径时,需要逃离(Evade)。

      

    2、排除通过狭窄的通道。

      SteeringForCollisionAvoidanceQueue:只躲避通道两侧的墙。

      SteeringForQueue:如果前方有AI,并且速度比自己慢,则降速。

      

    3、创建基于单元的导航图。

      

    4、可视点导航、导航网络。

      

      可视点导航图的缺点。首先,当场景很大时,手工放置路径点是很繁的,也很容易出错。其次,角色只能沿着边走,当起点、终点不在点、边上时,需要先走到最后的路径点,然后再寻路。

    5、导航网格。

      由于在同一网格内任意两点都是直接可达的,非常的高效。另外,每一个网格的面积可以无限大,使得搜索效率更加高效,并且占用内存更小。导航网格可以自动生成,无需手动生成。

      可以动态增加障碍物,但无法动态移除障碍物,无法处理移动的障碍物。

    6、考虑安全性、隐蔽性的寻路。

      

       实现躲避火力的一种计算方法:

      

    7、常见的寻路问题:

      1)当前点到单个目标点的寻路。

      2)当前点到多个目标点的寻路。

      3)战术寻路(如躲避火力)。

      4)分层寻路,如1楼到2楼。

      5)小队寻路。选择一个AI领队,其他成员跟随。另一种方法是,为每一个目标单位的目的地添加一个偏移,这样全队组员到达目标点时就不会堆叠在一起。同样的思路可以实现小队包围敌人。

        下面是动态偏移目标点的算法,让每一个目标点绑上 Destination.cs,然后在 Cohesion、Seperation作用下,自动扩散,慢慢达到动态平衡。

        

    8、一个AI角色可能有多个感知器。例如,战术感知器,用来扫描埋伏点和好的地方;环境感知器,检测墙和障碍;动态感知器,用于检测动态物体。

    9、视觉系统除了要考虑可见范围,还需要考虑:

      1)遮挡因素。目标虽然在视线范围内,但是否被其它物体遮挡。这需要使用 Line-Of-Sight(LOS视线测试)。

      2)光线因素。目标虽然在视频范围内,也没被遮挡,但处于黑暗地带导致不可见,当其头顶路灯突然亮起时,目标突然可见。

        

    10、感知系统分为 Trigger、Sensor。

    11、触觉感知。通常可使用Unity自带的物理系统。

    12、记忆感知。例如,即使暂时看不到玩家,只要还能记住玩家最后出现的位置,就会朝该位置追逐或射击。

    13、一个行为树的实例。

        

    14、行为树中条件结点(Condition)可以理解为 if 条件测试。玩家是否在20米之内?是否能看到玩家?如果条件测试结果为真,那么向你结点返回 success,否则 返回failure。

      

    15、选择节点(Selector)。从左到右依次执行所有子结点,只要子节点返回failure,就继续执行后续子结点,直到有一个节点返回success或running为止,这时它会停止后续子节点的执行,向父节点返回success或running。若所有子节点都返回failure,那么它向父节点返回failure。

      当子结点返回running时,选择结点会记住这个子节点,下个迭代会直接从该节点开始执行。

      考虑一个试图躲避枪击的AI角色,它可以通过寻找隐藏点,离开危险区域,或寻找援助等方式实现这个目标

        

      选择节点其实是一种优化级节点,左边的结点具有高优先级,右边的结点具有低优先级。

    16、顺序节点(sequence)。从左到右依次执行所有子结点,只要子节点返回success,就继续执行后续子结点,直到一个节点返回failure或running为止,这时它会停止后续节点的执行,向父结点返回failure或running。

        

    17、随机选择结点。

        

    18、修饰结点(Decorator)。以某种方式改变子结点的行为。

      例如,循环执行子结点,直到子结点失败。

        

      修饰结点包括 Until Failure、Until Success。

      Timer:等待一段时间才执行小结点。

      TimeLimit:指定某个节点的最长执行时间。

       Invert:对返回值取反。  

    19、并行结点(Parallel)。同时执行所有子结点,直到其中一个返回failure或全部返回success。

      当并行结点有一个条件结点时,意思是持续检查某一个条件,如果条件不满足,就停止执行

        

      

    20、状态机可以轮循,也可以事件通知。而行为树,只能轮循,即通过 Parallel + Until - If。

    21、一个行为树的示例。将状态切分为优先级,每次先Check优化级最高的状态。

      

    22、一棵战斗的行为树示例。

       

    23、

    24、

    25、

  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/tekkaman/p/9514410.html
Copyright © 2011-2022 走看看