找了下,大概有两个插件可以用:
1.PolyNav - 2D Pathfinding
2.Navigation2D Pathfinding
看了AssetStore上的介绍,前者比较早,从unity5就支持了,后者对unity的版本要求是Unity2017后的版本。今天介绍的是后者。
简单用了下还是比较好用,大概看了下应该是基于Unity原生的NavMash,改了下,变成2D。核心还是原生的,比较可靠。功能上支持静态的阻挡物和动态的阻挡物。但是有个核心组件NavMeshAgent2D用了少量的Linq,先介绍怎么使用,再介绍怎么修改这个组件去Linq。使用该插件文档,以及修改后的去Linq组件下载链接:
一、使用
静态阻挡物,只需要设置好原生的包围盒并设置成面板上设置Static即可。动态的阻挡物不用设置成Static,但包围盒还是需要设置,另外需要添加一个组件NavMeshObstacle2D下面是静态的阻挡物和动态的阻挡物添加组件后的示意图。
添加完组件后打开NavMesh生成界面
windows->Navigation2D
Agent Radius 设置成0.5,这个值越小,生成的导航网格越密集,越精确
NavMesh Extends 设置成1,如果大于1,将在包围范围外生成导航网格,这个就看需求吧
点击"Bake"按钮,生成就会生成导航网格
看了下代码,好像支持Unity2D的TileMap,但具体怎么个支持法,没细看。
二、去Linq修改
核心组件NavMeshAgent2D有两处用了Linq,意思都一样,就是把一个Vector3数组转成Vector2数组
public bool CalculatePath(Vector2 targetPosition, NavMeshPath2D path)
{
var temp = new NavMeshPath();
if (agent.CalculatePath(NavMeshUtils2D.ProjectTo3D(targetPosition), temp))
{
// convert 3D to 2D
//path.corners = temp.corners.Select(NavMeshUtils2D.ProjectTo2D).ToArray();
path.corners = Vector3sToVector2s(temp.corners);
path.status = temp.status;
return true;
}
return false;
}
被注释掉的那行就是原来的Linq代码,下面一行调用Vector3sToVector2s就是我新增加的去Linq的转换函数,其实也很简单
public Vector2 [] Vector3sToVector2s(Vector3 [] array)
{
Vector2[] result = null;
int length = 0;
if (array == null || (length = array.Length) <= 0)
{
return result;
}
result = new Vector2[length];
for(int i = 0; i < length; i++)
{
result[i] = NavMeshUtils2D.ProjectTo2D(array[i]);
}
return result;
}