Unity 3D 导航系统||Unity 3D 障碍物

news2024/9/30 1:34:45

Unity 3D 导航系统

过去,游戏开发者必须自己打造寻路系统,特别是在基于节点的寻路系统中,必须手动地在 AI 使用的点之间进行导航,因此基于节点系统的寻路非常烦琐。

Unity 3D 不仅具有导航功能,还使用了导航网格(navigation meshes),这比手动放置节点更有效率而且更流畅。

更重要的是,还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的复杂方法。

1) 设置 NavMesh

NavMesh 的设置方法很简单,在 Hierarchy 视图中选中场景中除了目标和主角以外的游戏对象,在 Inspector 视图中单击 Static 下拉列表,在其中勾选 Navigation Static 即可,如下图所示。

2) 烘焙

执行菜单 Window→Navation 命令,打开导航窗口,单击右下角的 Bake(烘焙)按钮即可,烘焙后的场景如下图所示。 

 接下来详细看看 Navigation 面板,它有 Object、Bake、Areas 这 3 个标签页。

其中,Object 标签页如下图所示,该标签页可以设置游戏对象的参数,如下表所示。当选取游戏对象后,可以在此标签页中设置导航相关参数。 

参 数功 能
Navigation Static勾选后表示该对象参与导航网格的烘焙
Generate OffMeshLinks勾选后可在导航网格中跳跃(Jump)和下落(Drop)
Navigation Area导航区域

Bake 标签页如下图所示,是 Navigation 面板最重要的标签页,在该标签页下可以设置导航代理相关参数以及烘焙相关参数,参数说明如下表所示。 

参 数功 能
Agent Radius设置具有代表性的物体半径,半径越小,生成的网格面积越大
Agent Height设置具有代表性的物体的高度
Max Slope设置斜坡的坡度
Step Height设置台阶高度
Drop Height设置允许最大的下落距离
Jump Distance设置允许最大的跳跃距离
Manual Voxel Size设置是否手动调整烘焙尺寸
Voxel Size设置烘焙的单元尺寸,控制烘焙的精度
Min Region Area设置最小区域
Height Mesh设置当地形有落差时是否生成精确而不是近似的烘焙效果

3) 设置导航代理

导航代理(Navigation Agent)可以理解为去寻路的主体。

在导航网格生成之后,给游戏对象添加了一个 Nav Mesh Agent 组件,如下图所示。

Nav Mesh Agent 面板中各导航代理参数含义如下表所示。 

属性分区参 数功 能
Agent SizeRadius设置导航代理的半径
Height设置导航代理的高度
Base Offset设置圆柱体相对于本地坐标的偏移
SteeringSpeed设置最大移动速度
Angular Speed设置最大角速度
Acceleration设置最大加速度
Stopping Distance设置离目标距离还有多远时停止
Auto Braking激活时,到达目标位置前将减速
Obstacle AvoidanceQuality设置躲避障碍物的质量,如果设置为0则不躲避其他导航 代理
Priority设置自身的导航优先级,范围是0〜99,值越小,优先级 越大
Path FindingAuto Traverse Off Mesh Link设置是否采用默认方式经过链接路径
Auto Repath设置当现有的路径变为无效时是否尝试获取一个新的路径
Area Mask设置此导航代理可以行走哪些区域类型

实践案例:自动寻路

案例构思

使用 Unity 3D 开发游戏,自动寻路可以有很多种实现方式。A 星寻路是一种比较传统的人工智能算法,在游戏开发中比较常用。

另外,Unity 3D 官方内置的寻路插件 Navmesh 也可以实现自动寻路功能。

本案例旨在通过一个简单的三维场景漫游实现 Navmesh 自动寻路插件的使用。

案例设计

本案例在 Unity 3D 内创建一个简单的三维场景,场景内有各种障碍,通过 Navmesh 插件可以自动寻找到目标位置。

案例实施

步骤 1):新建三维场景,将其命名为 Navigation。其中,胶囊体作为动态移动的对象,球体作为导航的目标,如下图所示。 

 步骤 2):选中场景中所有除了 sphere、cylinder 摄像机以及直线光以外的所有物体,单击 Inspector 面板中右上角的 Navigation Static,使这些物体成为静态物体,并设置成 Navigation Static 类型,如下图所示。 

步骤 3):执行菜单栏中的 Window→Navigation 命令,Navigation 面板如下图所示。

步骤 4):单击该面板右下角的 Bake 按钮,即可生成导航网格,下图为已生成的导航网格。 

步骤 5):下面就可以让一个胶囊体根据一个导航网格运动到目标 Sphere 位置。执行 Component→Navigation→Nav Mesh Agent 为该胶囊体挂载一个 Nav Mesh Agent,如下图所示。 

步骤 6):最后写一个脚本就可以实现自动寻路了。创建 C# 脚本,将其命名为 DemoNavigation,脚本如下: 纯文本复制

 
  1. using UnityEngine;
  2. using System.Collections;
  3. public class DemoNavigation:MonoBehaviour{
  4. public Transform target;
  5. void Start(){
  6. if(target!=null){
  7. this.gameObject.GetComponent<NavMeshAgent>().destination=target.position;
  8. }
  9. }
  10. }

步骤 7):脚本新建完成后挂载到胶囊体上,然后将 Sphere 赋予胶囊体的 Navigation 脚本,运行场景,如下图所示,胶囊体会运动到 Sphere 的位置。 

 Unity 3D 障碍物

(Nav Mesh Obstacle) 一般来说,不可攀爬的 Nav Mesh 都被视为障碍物(Nav Mesh Obstacle),也可以直接将物体设为障碍物,即可以为游戏对象添加 Nav Mesh Obstacle 组件。

有别于普通的 Nav Mesh,Nav Mesh Obstacle 是一种不需要烘焙的障碍物,形状可以选择为立方体或胶囊体。

实践案例:障碍物绕行

案例构思

在自动寻路过程中,往往会遇到障碍物,在寻路过程中遇到障碍物要怎样解决呢?

Unity 官方内置的寻路插件 Navmesh 完美地解决了这个问题。

本案例通过一个简单的有障碍的场景,实现自动寻路中障碍物绕行功能。

案例设计

本案例在 Unity 3D 内创建一个有障碍的场景,场景内有一个 Cube 用来充当障碍物,通过 Navmesh 插件实现主角遇到障碍物时自动绕行效果。 案例实施 步骤 1):执行 File→Save Scene as 命令,将 Navigation 场景另存为 Obstacle 场景,如下图所示。 

 步骤 2):执行 GameObject→3D Object→Cube 命令新建一个障碍物,将其放置在主角的前方,并赋予黑色材质,如下图所示。 

步骤 3):执行 Component→Navigation→Nav Mesh Obstacle 命令添加 Nav Mesh Obstacle 组件,如下图所示。 

步骤 4):单击 Play 按钮进行测试,可以发现主角会绕过黑色立方体并到达终点,效果如下图所示。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客练习赛106 药丸

牛客练习赛106 药丸 2022.12.02 与舍友四排玩了团体对抗的模式&#xff0c;练习赛就只有40分钟的剩余时间了。 题目描述 来源&#xff1a;牛客网 牛牛有 nnn 个属性&#xff0c;第 iii 个属性的初始值为 aia_iai​ &#xff0c;牛牛想把第 iii 个属性的值变为目标值 bib_ib…

享元模式Flyweight

1.意图&#xff1a;运用共享技术有效地支持大量细粒度的对象。 2.结构 描述一个接口&#xff0c;通过这个接口Flyweight可以接受并作用于外部状态&#xff1b; ConcreteFlyweight实现Flyweight接口&#xff0c;并为内部状态&#xff08;如果有&#xff09;增加存储空间。Conr…

超融合时序数据库YMatrixDB与PostGIS案例

目录 什么是PostGIS PostGIS的特点 PostGIS 基础知识 OGC的WKB和WKT格式 插入数据实例 EWKT、EWKB和Canonical格式 插入数据实例 SQL-MM格式 常几何类型和函数 常用操作符 常用操作函数 OGC标准函数 管理函数 几何对象关系函数 几何对象处理函数 几何对象存取函…

Redis中的事务可以满足ACID属性吗?

前言 事务是数据库操作的最小工作单元&#xff0c;由一个有限的数据库操作序列构成。这些操作要么全部执行&#xff0c;要么全部不执行&#xff0c;是一个不可分割的工作单位。一键获取最先java文档。 事务在执行时&#xff0c;会提供专门的属性保证&#xff1a;原子性、一致性…

[附源码]Python计算机毕业设计Django高校学生摄影作品展示平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

sentinel读取监控文件分析

主要分析的类 com.alibaba.csp.sentinel.dashboard.metric.MetricFetcher在sentinel监控数据db持久化中&#xff0c;更换了MetricController的存储实现&#xff0c;可以发现com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository原来只有com.alibaba.csp.s…

第4季3:Hi3518e的sensor接口引脚复用设置

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 在第2、3季的内容中&#xff0c;在板载系统的配置脚本即/etc/profile文件中&#xff0c;都有如下这句代码&#xff1a; ./load3518e -i -sensor ar0130 -osmem 32 -total 64 在第4季1&#xff1a…

MAC glucuronide linker-1/MAC glucuronide linker-2蛋白降解酶

ERRa_PROTAC&#xff08;Cpd11&#xff0c;D1oonM40%&#xff09;蛋白降解活性随着Linker的增长而减弱。Linker -(CHz)s-的化合物13d在浓度30 nM时能够降解58%的蛋白&#xff0c;浓度为100 nM时能够降解78%的ERRα蛋白&#xff0c;其降解活性不如 13c。Linker -(CHz)z-的13f&…

java计算机毕业设计ssm齐市疫苗管理系统w80jw(附源码、数据库)

java计算机毕业设计ssm齐市疫苗管理系统w80jw&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校心理咨询管理系统0e78p

大部分步骤是 1.确定选题 选题的确定需要查阅大量的资料&#xff0c;要搞清楚自己大概想要研究的方向是什么。可以选择自己感兴趣的学科或者强势的学科进行研究&#xff0c;同时要多和毕业指导老师多交流&#xff0c;征求老师的意见和建议&#xff0c;最后确立选题。计算机专业…

面试官:你知道 Java 中的回调机制吗?

调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种。 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b(), 一直等待b()方法执行完毕, a()方法继续往下走. 这种调用方式适用于方法b()执…

【论文速读】Scene Text Telescope: Text-Focused Scene Image Super-Resolution

前言 在阅读这篇文章的时候&#xff0c;我花费了近一周的时间在将其基本消化理解&#xff0c;至于为什么花费如此长的时间&#xff0c;我发现主要原因是我对transformer一知半解&#xff0c;所以在transformer中提出的名词&#xff0c;例如&#xff1a;Postion-Wise Feed-Forw…

365天深度学习训练营-第P3周:天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 内部限免文章&#xff08;版权归 K同学啊 所有&#xff09;&#x1f366; 参考文章地址&#xff1a; &#x1f517;第P3周&#xff1a;天气识别 | 365天深度学习训练营&#x1f356; 作者&#xff1a;K同学啊 | 接辅导、…

视频转文字怎么操作?这三种转换方法你该学会

如今短视频让各种知识传播变得生动形象&#xff0c;但是视频学习对于后期的整理复习不是很便捷&#xff0c;现在教大家一种好用的视频知识整理方法&#xff0c;那就是视频转文字&#xff0c;可以将视频内容轻松转换为文字形式。那么就有人问了&#xff0c;怎样转换才更简单呢&a…

WeakHashMap 和 HashMap 的区别是什么,何时使用?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在之前的文章里&#xff0c;我们聊到了 Java 标准库中 HashMap 与 LinkedHashMap 的实现原理。HashMap 是一个标准的散列表数据结构&…

eval()方法字符串转对象; 分别取对象属性名和属性的方法

字符串转对象 ⬇️ A是字符串 转对象&#xff1a; let B eval(‘ (‘ A ‘) ‘) B就是A转成的对象 取对象属性名(for ... in ... ) ⬇️ let C []; for(let key in B) { C.push(key); console.log(key); // 打印所有属性名 console.log(B[key]); // 打印所有属性值…

“元宇宙”虚拟世界的营销法则 “品牌元宇宙空间”算什么?

虚拟世界从来不缺吃螃蟹的品牌。 “元宇宙”依旧是当下品牌创新营销的重要形式&#xff0c;从时趣的行业观察来看&#xff0c;大量品牌方都有着元宇宙的营销意向&#xff0c;但在营销落地上存在不同的进度。一个显而易见的事实是&#xff0c;元宇宙不仅仅是一个虚拟的游戏空间…

RabbitMQ之负载均衡-HAProxy

将客户端的连接和操作的压力分散到集群中的不同节点&#xff0c;防止单个或几台服务器压力过大成为访问的瓶颈&#xff0c;甚至宕机。HAProxy是一款开源免费&#xff0c;并提供高可用性、负载均衡以及基于TCP和HTTP协议的代理软件&#xff0c;可以支持四层、七层负载均衡&#…

虚拟列表渲染-前端性能优化

目录 1 使用场景 2 小插曲 3 虚拟列表渲染实现原理 4 代码实现 1 使用场景 在做EMBP项目时&#xff0c;有个模板新建的需求&#xff0c;需要点击获取子任务时获取所有的子任务&#xff0c;当时有的数据比较大&#xff0c;会有几百条的情况&#xff0c;此时接口请求变得很慢…

高可用网站架构云化

高可用网站架构云化 一、背景 早期互联网产品用户量少&#xff0c;并发量低&#xff0c;数据量小&#xff0c;多数只需要单个应用服务器可以满足需要&#xff0c;而数据库和文件服务部署在外部单个服务器上。随着业务在线化、互联网化的高速发展&#xff0c;企业对核心业务系统…