最近在做的功能,要求地圖上的角色隨機移動。最快發(fā)方法當(dāng)然是隨機一個角色方向,角色往這個反向移動幾秒,然后繼續(xù)隨機反向移動,如此循環(huán)。這種方法雖然簡單,但是看起來角色非?!吧怠薄?br>
??我的地圖中使用了NavMesh,那是不是可以從烘焙好的NavMesh中,隨機取一個點,然后設(shè)置NavMeshAgent.SetDestination。這樣會使角色更“鮮活”。
??要在NaveMesh中隨機取點,那就得先取到NaveMesh所有的頂點。Unity中提供了NavMesh.CalculateTriangulation()方法。該方法可以返回NavMesh所有頂點的數(shù)組。而且,數(shù)組中每相鄰的三個頂點,就是NavMesh中三角面的頂點。那么,隨機數(shù)組中的一個頂點,再取其相鄰的兩個頂點,就可以隨機取到一個三角面。
??隨機取三角面解決了,那么在三角形中隨機取一個點就更簡單了。直接上代碼:
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;
}