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、

  • 相关阅读:
    mysql中事务隔离级别可重复读说明
    Zookeeper安装与启动
    PHP闭包之bind和bindTo
    使用WebPack打包
    用Python下载momentum中的精美壁纸
    supervisor使用
    Shell脚本:RedisKey批量删除
    使用Certbot配置站点的https
    PHPfmt代码格式化
    创建用私钥签名的证书
  • 原文地址:https://www.cnblogs.com/tekkaman/p/9514410.html
Copyright © 2011-2022 走看看