最近在做的功能书斜,要求地圖上的角色隨機移動。最快發(fā)方法當(dāng)然是隨機一個角色方向酵使,角色往這個反向移動幾秒荐吉,然后繼續(xù)隨機反向移動,如此循環(huán)口渔。這種方法雖然簡單样屠,但是看起來角色非常“傻”缺脉。
??我的地圖中使用了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;
}