【风宇冲】Unity3D教程宝典之路径搜寻:第二讲SimplePath详细教程

http://blog.sina.com.cn/s/blog_471132920101ftox.html


原创文章如需转载请注明:转载自风宇冲Unity3D教程学院

       
                             路径搜寻第二讲:SimplePath详细教程

                        

SimplePath是一款效率不错的unity寻路插件。

优点:效率高,可视化好。用的是网格而不是way point或者nav mesh,不会有复杂的转弯
缺点:网格方向只能是沿着x轴及z轴铺开,故只能做水平面的寻路,如果要既在水平面寻路,又要在垂直面如爬大楼侧面的寻路则无法实现。


【使用方法】
(1)新建一个Plane作为地形
(2)在 路径 SimplePath->Main->Resources下, 新建一个叫PathGridWithObstacles的Prefab,并调节Cell Size,Number of rows,Number of columns。使网格与Plane对应
【风宇冲】Unity3D教程宝典之路径搜寻:第二讲SimplePath详细教程_第1张图片
(3) SimplePath->Examples->Resources->Prefabs,将Prefab Actor_Patrol拖拽进场景里
(4)路径同上,拖拽2个 Patrol Node 至场景里
(5)创建PathManager
指定其中的Path Terrain Component为之前创建的PathGridWithObstacles。
Actor_Patrol里指定Path Manager,和Interation_Patrol下面的“Patrol Nodes ”指定为之前创建的Node

现在运行场景, Actor_Patrol会在2个Patrol Node间巡逻了。之后我们加障碍
(6)回到 SimplePath->Main->Resources路径,拖拽数个Obstacle_Box至场景,形成2个巡逻点间的障碍
运行场景, Actor_Patrol会在2个 Patrol Node间绕过障碍物巡逻。
【风宇冲】Unity3D教程宝典之路径搜寻:第二讲SimplePath详细教程_第2张图片

运行时的Scene界面,黄线为路径。
【风宇冲】Unity3D教程宝典之路径搜寻:第二讲SimplePath详细教程_第3张图片
【PathManager】
管理路径的预制体,可以是一个,也可以是多个用于分类管理。在Agent的PathAgentComponent里指定对应PathManager。
参数:
(1)Path Terrain Component:寻路的地形
(2)Max Number of Nodes Per Planner:每个planner的路径点池的数量上限。因为每个planner所占用的内存是预分配的。所以只有小于该值才能正常寻路。
(3)Max Number of Planners:对应寻路Agent的数量。例如,如果有25个Agent同时在寻路,而该值为20的话,超出的那5个Agent将不会进行寻路。
(4)Max Number of Cycles per frame:一般留默认值即可。每帧运行A* Cycles的次数。
(5)Max Number of Cycles per planner:一般留默认值即可。每帧单一planner或者agent可以运行A* Cycles的次数。

【Terrain】
一:PathGridComponent:地形核心,设定网格
二:ObstacleGridComponent:如果有障碍物则再添加此脚本。
Rasterize Every Frame:如果障碍物为动态改变位置的,可以勾选,但是开销大。可以手动在代码里调用 Rasterize函数。
三:HeightmapComponent_UnityTerrain:如果导入Height则导入此脚本。
具体步骤:
1建好Terrain
2创建PathGridWithObstaclesAndHeightmap Prefab的实例
3在PathGridWithObstaclesAndHeightmap里指定Terrain即可。
剩余与普通步骤一样,只是这种方法没有网格显示。
【风宇冲】Unity3D教程宝典之路径搜寻:第二讲SimplePath详细教程_第4张图片

【Agent】
每个Agent都有这几个部分PathAgentComponent, SteeringAgentComponent,NavigationAgentComponent。不同的是交互组建 Interaction Component。

PathAgentComponent:

SteeringAgentComponent:处理PathAgentComponent的输出,即点列表,并在点之间移动。

NavigationAgentComponent:
只要有NavigationAgentComponent的GameObject就要有PathAgentComponent,SteeringAgentComponent, RigidBody.
Use Path Smoothing:勾的话移动会沿着平滑轨迹,不勾的话会沿着格子的中点移动。
属性:
Arrival Distance: 到达距离目标点x距离时,视为到达目标。
Max Speed:移动的最大速度
Look Ahead Distance:值越小,移动越贴着路线。越大,越远离路线。该值太大或者太小都有可能导致agent卡死。
Slowing Distance:离目标多远开始减速,填0则不减速。
Acceleration Rate:加速度
Gravitational Acceleration Rate:重力加速度。

Interaction Component:
分为以下三种:
Interaction_Chase:
跟踪一个物体。
Interaction_Patrol:
在N个巡逻点间巡逻。
Interaction_Wander:
探索周围的世界。

Interaction也可以通过脚本实现:
移动到目标位置:
NavigationAgentComponent. MoveToPosition(Vector targetPos,replanInterval);
移动到目标物体,对应Interaction_Chase:
NavigationAgentComponent. MoveToGameObject (GameObject target,replanInterval);

见如下脚本。
  1. using UnityEngine;
  2. using System.Collections;
  3. public class MyControl : MonoBehaviour {
  4.     public GameObject targetObj;
  5.     public Vector3 targetPos;
  6.     public NavigationAgentComponent navAgentComponent;
  7.    
  8.     void OnGUI()
  9.     {
  10.         if(GUI.Button(new Rect(0,0,100,100),"Go"))
  11.         {
  12.             //navAgentComponent.MoveToPosition(targetPos,0.5f);
  13.             navAgentComponent.MoveToGameObject(targetObj,0.5f);
  14.         }
  15.     }
  16. }
agent成功完成寻路任务后,agent会运行OnNavigationRequestSucceeded()函数。
agent寻路失败后,agent会运行OnNavigationRequestFailed()函数。

你可能感兴趣的:(【风宇冲】Unity3D教程宝典之路径搜寻:第二讲SimplePath详细教程)