Unity GameAI-(9)Hide

Hide(隐藏)

  • Hide行为旨在找到一个位置使得障碍物总是在角色自身和它想躲开的智能体之间。

  • 图中的黑点为潜在的隐藏点,圆形为障碍物,黑色三角为躲藏体


    Image.png

Hide算法思想

  • 找到合适的隐藏点
    • 确定附近障碍物对应的隐藏点
    • 计算出到每个隐藏点的距离,找出最近隐藏点
  • 使用Arriva行为移向最近处(动态避开障碍物)
  • 如果找不到合适的障碍物,则Evade目标

Step(1)

  • 对于每一个障碍物计算出隐藏点
  • 最好的做法是以躲藏体的中心为圆心画圆,找出这个范围内所有可以躲藏的地点,并移向最近的隐藏点,这里将不使用圆,将所有的隐藏点都计算出来。


    Image.png
  • DistanceFromBoundary:需要离躲避障碍物多远。可以通过(obstacle.postion-hidePoint.positon).maguie -obstacle.radius得到。

Step(2)

  • 计算出到每个隐藏点的距离,距离角色最近的点即为合适的隐藏点。

Step(3)

  • 智能体使用arrival行为移向最近处,如果找不到合适的障碍物,则Evade

代码实现

  • 首先为场景添加障碍物,红色方块为躲藏体,白色Sphere为障碍物
Paste_Image.png
  • 为两个红色的躲藏体添加Hide脚本,并添加需要使用到的字段
Paste_Image.png
  • 将障碍物放入Obstacles数组里
Paste_Image.png
  • 在拖放障碍物时可以先锁定Inspector面板
Paste_Image.png
  • 添加Hunter
Paste_Image.png
  • 到达Hide重点(获取最佳隐藏点)
    • 通过sphere上的collider获取到障碍物的半径,并针对Scale缩放问题进行优化。获取到DistAway,隐藏点到障碍物圆心的距离
    • 接着得到隐藏点的全局坐标
Paste_Image.png
  • 得到隐藏点以后开始进行判断,最佳隐藏点
    • 在getSteeringForce方法里先声明三个需要计算的Vector3
Paste_Image.png
  • 接着进行foreach遍历找出最佳隐藏点
Paste_Image.png
  • 分别对找到了何没有找到最佳隐藏点进行判断,如果找到了使用arrival进行判断减速半径问题。
Paste_Image.png
  • 最后将得到的操控力进行使用
Paste_Image.png

效果实现:

  • 起始位置


    Paste_Image.png
  • 进行Hide

Paste_Image.png

最后谢谢寒江独钓9527老师的指导。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容