【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来避免障碍,确保物体沿着可行走区域移动。

相关内容

热门资讯

Mysql常用数据类型总结 整形 枚举类型ENUE整形       TINYINT,SMALLINT,MEDIUMINT,IN...
【flink sql】创建表 flink sql创建表语法 CREATE TABLE [IF NOT EXISTS] [catal...
python opencv 保... 👨‍💻个人简介: 深度学习图像领域工作者 dz...
Pytorch深度学习实战3-... 目录1 数据集Dataset2 数据加载DataLoader3 常用预处理方法4 模型处理5 实例&...
自定义类型的超详细讲解ᵎᵎ了解...   目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明  1.4结构...
Docker等容器技术如何与移... 移动应用程序的开发面临着很多挑战,包括开发环境的设置、测试的困难、部署的复杂性等。由于...
【微服务】—— Nacos安装... 文章目录1. Windows安装1.1 下载安装包1.2 解压1.3 端口配置1.4 启动1.5 访...
【OpenGL】 为了理解这个函数我们需要先学习一些OpenGL的内容 OpenGL可视化 https://g...
hjr-详细说一下Redis集... Redis作用 缓存 一般我们用Redis做缓存,热点数据 击穿:访问到...
【蓝桥杯】 C++ 数字三角形... 文章目录题目描述输入描述输出描述实现代码解题思路注意点知识点 题目描述 上图给出了一个数字三角形。从...
VR全景展会丨探索未来,重塑现... 随着科技的不断发展,虚拟现实(VR)技术逐渐成为一个重要的...
C++数据类型 目录 C++基础数据类型 指针 指针类型 指针赋值 引用 参考:《深...
超实用!!! 三分钟将你的项目... 文章目录前言一、在项目中新增配置二、配置github page setting?三、如...
数据结构---队列 专栏:数据结构 个人主页:HaiFan. 专栏简介:这里是...
数字操作方法 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
Cartesi 2023 年 ... 查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在...
JavaWeb——jsp概述入... JSP定义:  在如下一个jsp文件里面有如下的代码  <%@ page content...
一切喜怒哀乐都来自于你的认知 01 有个学子,准备出国,父母请来清华的教授宁向东。请问教授࿱...
JAVA并发编程——synch... 引言         Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,...
git学习----3.21 未... 文章目录前言Git :一个分布式版本控制工具目标一、概述1.1 开发中的实际场景1.2...
Qt优秀开源项目之十七:QtP... QtPromise是Promises/A+规范的Qt/C++实现。该规范的译...
【前端八股文】JavaScri... 文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和...
海康硬盘录像机接入RTSP/o... EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供...
在混合劳动力时代如何避免网络安... 在混合劳动力时代如何避免安全网络风险 三年多来,混合工作一直是工作生活中不可或缺的一...
2023还不懂Jmeter接口... 这里介绍的Jmeter接口测试的的实战,如果文章内容没遇看懂的话,我这边...
基于4G/5G弱网聚合的多链路... 基于4G/5G多卡聚合(弱网聚合)的智能融合通信设备技术亮点 增强带宽提供可靠连接 通过将多个有线和...
如何使用Synplify综合v... 文章目录使用Synplify综合的好处synplify的教程方法1(无效)...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
2022年18个值得期待的Le... 有数百个独特的LearnDash附加组件,您可能很难选择您的LearnDash LMS...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...