最近在做的功能,要求地图上的角色随机移动。最快发方法当然是随机一个角色方向,角色往这个反向移动几秒,然后继续随机反向移动,如此循环。这种方法虽然简单,但是看起来角色非常“傻”。
我的地图中使用了NavMesh,那是不是可以从烘焙好的NavMesh中,随机取一个点,然后设置NavMeshAgent.SetDestination。这样会使角色更“鲜活”。
要在NaveMesh中随机取点,那就得先取到NaveMesh所有的顶点。Unity中提供了NavMesh.CalculateTriangulation()方法。该方法可以返回NavMesh所有顶点的数组。而且,数组中每相邻的三个顶点,就是NavMesh中三角面的顶点。那么,随机数组中的一个顶点,再取其相邻的两个顶点,就可以随机取到一个三角面。
随机取三角面解决了,那么在三角形中随机取一个点就更简单了。直接上代码:
public Vector3 GetRandomLocation()
{
NavMeshTriangulation navMeshData = NavMesh.CalculateTriangulation();
int t = Random.Range(0, navMeshData.indices.Length - 3);
Vector3 point = Vector3.Lerp(navMeshData.vertices[navMeshData.indices[t]], navMeshData.vertices[navMeshData.indices[t + 1]], Random.value);
point = Vector3.Lerp(point, navMeshData.vertices[navMeshData.indices[t + 2]], Random.value);
return point;
}