📅  最后修改于: 2023-12-03 15:06:48.874000             🧑  作者: Mango
NavMesh 是 Unity 中用于处理游戏对象移动与碰撞检测的一种技术。它可以在场景中自动生成一个可行走区域,使游戏对象可以沿着可行走区域进行移动。在游戏中,我们可以利用 NavMesh 实现对象的随机运动,使其更加生动有趣。
在 Unity 中创建 NavMesh 非常简单,只需要在场景中创建一个空对象,然后在该对象上添加 NavMeshSurface 组件即可。在 NavMeshSurface 组件中,我们可以设置 NavMesh 的默认层级、大小、空间类型、对撞机类型等属性。如下所示:
1. 创建一个空对象,命名为 NavMesh。
2. 在 NavMesh 对象上添加 NavMeshSurface 组件。
3. 在 NavMeshSurface 上设置 NavMesh 的属性。
在场景中创建好 NavMesh 后,我们就可以在场景中添加需要运动的对象。下面我们来介绍一下如何实现对象随机运动。
NavMesh navMesh = FindObjectOfType<NavMesh>();
List<NavMeshBuildSource> sources = new List<NavMeshBuildSource>();
NavMeshBuilder.CollectSources(navMesh.gameObject.layer, NavMeshCollectGeometry.RenderMeshes, 0, new NavMeshBuildSettings(), sources);
Vector3 randomPosition = new Vector3(Random.Range(-10, 10), 0, Random.Range(-10, 10));
if(NavMesh.SamplePosition(randomPosition, out NavMeshHit hit, 1f, NavMesh.AllAreas))
{
navMeshAgent.SetDestination(hit.position);
}
下面是一个简单的示例代码,在场景中只创建了一个可行走区域和一个对象,并实现了对象的随机运动。
public class RandomMovement : MonoBehaviour
{
NavMeshAgent navMeshAgent;
private void Start()
{
navMeshAgent = GetComponent<NavMeshAgent>();
}
private void Update()
{
if(navMeshAgent.remainingDistance < 0.5f)
{
Vector3 randomPosition = new Vector3(Random.Range(-10, 10), 0, Random.Range(-10, 10));
NavMesh navMesh = FindObjectOfType<NavMesh>();
List<NavMeshBuildSource> sources = new List<NavMeshBuildSource>();
NavMeshBuilder.CollectSources(navMesh.gameObject.layer, NavMeshCollectGeometry.RenderMeshes, 0, new NavMeshBuildSettings(), sources);
if(NavMesh.SamplePosition(randomPosition, out NavMeshHit hit, 1f, NavMesh.AllAreas))
{
navMeshAgent.SetDestination(hit.position);
}
}
}
}
在本文中,我们介绍了如何在 Unity 中使用 NavMesh 实现对象的随机运动。通过对 NavMesh 的认识和使用,我们可以更加方便地实现游戏对象的移动和碰撞检测,使游戏变得更加生动有趣。