📜  使用 navmesh 进行对象随机运动 (1)

📅  最后修改于: 2023-12-03 15:06:48.874000             🧑  作者: Mango

使用 NavMesh 进行对象随机运动

NavMesh 是 Unity 中用于处理游戏对象移动与碰撞检测的一种技术。它可以在场景中自动生成一个可行走区域,使游戏对象可以沿着可行走区域进行移动。在游戏中,我们可以利用 NavMesh 实现对象的随机运动,使其更加生动有趣。

在场景中创建 NavMesh

在 Unity 中创建 NavMesh 非常简单,只需要在场景中创建一个空对象,然后在该对象上添加 NavMeshSurface 组件即可。在 NavMeshSurface 组件中,我们可以设置 NavMesh 的默认层级、大小、空间类型、对撞机类型等属性。如下所示:

1. 创建一个空对象,命名为 NavMesh。
2. 在 NavMesh 对象上添加 NavMeshSurface 组件。
3. 在 NavMeshSurface 上设置 NavMesh 的属性。
对象随机运动的实现

在场景中创建好 NavMesh 后,我们就可以在场景中添加需要运动的对象。下面我们来介绍一下如何实现对象随机运动。

实现思路
  • 获取随机的目标位置。
  • 判断目标位置是否在可行走区域内。
  • 如果在可行走区域内,就设置对象的寻路目标为该位置,开始移动。
  • 如果不在可行走区域内,就重新获取目标位置。
实现步骤
  1. 在场景中创建需要运动的对象。
  2. 在对象上添加 NavMeshAgent 组件,用于实现对象的寻路移动。
  3. 在代码中获取 NavMesh。代码如下:
NavMesh navMesh = FindObjectOfType<NavMesh>();
  1. 获取 NavMesh 中的所有可行走区域。
List<NavMeshBuildSource> sources = new List<NavMeshBuildSource>();
NavMeshBuilder.CollectSources(navMesh.gameObject.layer, NavMeshCollectGeometry.RenderMeshes, 0, new NavMeshBuildSettings(), sources);
  1. 获取随机位置。
Vector3 randomPosition = new Vector3(Random.Range(-10, 10), 0, Random.Range(-10, 10));
  1. 判断位置是否在可行走区域内。
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 的认识和使用,我们可以更加方便地实现游戏对象的移动和碰撞检测,使游戏变得更加生动有趣。