Unity GameAI-(9)Hide

Hide(隐藏)

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

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


    Unity GameAI-(9)Hide_第1张图片
    Image.png

Hide算法思想

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

Step(1)

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


    Unity GameAI-(9)Hide_第2张图片
    Image.png
  • DistanceFromBoundary:需要离躲避障碍物多远。可以通过(obstacle.postion-hidePoint.positon).maguie -obstacle.radius得到。

Step(2)

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

Step(3)

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

代码实现

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

效果实现:

  • 起始位置


    Unity GameAI-(9)Hide_第12张图片
    Paste_Image.png
  • 进行Hide

Unity GameAI-(9)Hide_第13张图片
Paste_Image.png

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

你可能感兴趣的:(Unity GameAI-(9)Hide)