【Unity】NavMesh Agent实现自动寻路
创始人
2025-05-31 02:12:57

在Unity中,可以使用自带导航系统(Navigation System)实现自动寻路。

一、创建NavMesh表面

首先在Unity场景中创建一个NavMesh表面,用于描述场景中可行走的区域。

在Unity 5.6或更高版本中,可以通过以下步骤创建NavMesh表面:

  1. 选择场景中的地形或物体,右键菜单中选择“Navigation” -> “Bake NavMesh”。

  1. 在弹出的“NavMesh Bake”窗口中,设置NavMesh的大小和精度,并设置NavMesh的各个层级的区域类型(例如地面、墙壁、楼梯等)。

  1. 点击“Bake”按钮,等待Unity计算NavMesh表面。

这样就可以在场景中生成NavMesh表面,表示可行走区域。

二、使用NavMesh Agent组件

接下来,在需要寻路的物体上添加一个NavMesh Agent组件,用于计算路径并移动物体。

  1. 在Unity中选择需要寻路的物体,添加NavMesh Agent组件。

  1. 在NavMesh Agent组件中设置Agent的属性,包括移动速度、旋转速度等等。

三、计算路径

当NavMesh Agent组件添加到物体上后,使用C#脚本来计算路径并让物体移动。

以下是一个基本的计算路径的脚本:

using UnityEngine;
using UnityEngine.AI;public class MoveToDestination : MonoBehaviour {public Transform target;NavMeshAgent agent;void Start () {agent = GetComponent();}void Update () {agent.SetDestination(target.position);}
}

在这个脚本中,首先获取NavMesh Agent组件,并将需要移动到的目标位置设置为NavMesh Agent的目标位置。

然后在Update函数中,通过调用SetDestination方法来计算路径并移动物体。

四、使用Raycast避免障碍

在计算路径时,需要避免障碍物,确保物体沿着可行走区域移动。

可以使用Raycast来检测物体前方是否有障碍物。

如果检测到障碍物,则通过调整目标位置来绕过障碍物。

以下是一个基本的避障脚本:

using UnityEngine;
using UnityEngine.AI;public class AvoidObstacles : MonoBehaviour {public Transform target;NavMeshAgent agent;void Start () {agent = GetComponent();}void Update () {RaycastHit hit;if (Physics.Raycast(transform.position, transform.forward, out hit, 1.0f))         {// 如果前方有障碍物,则绕过障碍物Vector3 targetPosition = transform.position + (transform.right * (Random.Range(0, 2) == 0 ? -1 : 1) * 2.0f);NavMeshHit navMeshHit;if (NavMesh.SamplePosition(targetPosition, out navMeshHit, 2.0f, NavMesh.AllAreas)) {agent.SetDestination(navMeshHit.position);}} else {// 如果前方没有障碍物,则移动到目标位置agent.SetDestination(target.position);}}
}

在这个脚本中,首先使用Raycast检测物体前方是否有障碍物。

如果检测到障碍物,通过调整目标位置来绕过障碍物。

然后通过调用NavMesh的SamplePosition方法来找到最近的可行走位置,并设置NavMesh Agent的目标位置。

如果前方没有障碍物,则直接移动到目标位置。

五、总结

在本教程中,介绍了如何使用Unity自带的导航系统(Navigation System)实现寻路功能。

首先,需要在场景中创建NavMesh表面,用于描述场景中可行走的区域。

然后,需要在需要寻路的物体上添加NavMesh Agent组件,并使用C#脚本计算路径并移动物体。

最后,介绍了如何使用Raycast来避免障碍,确保物体沿着可行走区域移动。

相关内容

热门资讯

吸猫伐是什么意思 吸猫是吸哪里 作为铲屎官,相信对于网络上流行的各种与猫咪相关的梗都是了然于心的,什么吸猫啦,撸猫啦,云养猫啦……等...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
重庆属于哪个省份的 重庆在中国... 重庆有多大,大到超出我们的想象,重庆作为我国4个直辖市之一,印象里应该跟京津沪面积差不多,可事实上却...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...