Unity核心10——导航寻路系统

2023-10-31

Unity 中的导航寻路系统是能够让我们在游戏世界当中,让角色能够从一个起点准确的到达另一个终点,并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往

​ Unity 中的导航寻路系统的本质,就是在 A 星寻路算法的基础上进行了拓展和优化

  1. 导航网格(NavMesh)的生成——要想角色能够在场景中自动寻路产生行进路径,那么必须得先有场景地形数据,导航网格生成就是生成用于寻路的地形数据

  2. 导航网格寻路组件(NavMesh Agent)——寻路组件就是帮助我们根据地形数据计算路径让角色动起来的关键

  3. 导航网格连接组件(Off-Mesh Link)——当地形中间有断层,想让角色能从一个平面跳向另一个平面,网格连接组件时关键

  4. 导航网格动态障碍物组件(NavMesh Obstacle)——地形中可能存在的可以移动或动态销毁的障碍物需要挂载的组件

一、导航网格 (NavMesh)

​ 打开导航网格窗口 Window -> AI -> Navigation:Unity 内置的导航网格生成窗口

  1. Object页签——设置参与寻路烘焙的对象

  2. Bake页签——导航数据烘焙页签,设置寻路网格具体信息

  3. Areas页签——导航地区页签,设置对象的寻路消耗

  4. Agents页签——代理页签,设置寻路代理信息

(一)Object页签

  1. Sceme Filter:场景过滤器,配合 Hierarchy 窗口使用
  2. All:显示场景上所有对象
  3. MeshRenderers:显示挂载的网格渲染器的对象
  4. Terrains:显示挂载了地形脚本的对象
  5. Navigation Static:导航静态物体开关
  6. Generate OffMeshLinks:生成网格连接点开关
  7. Navigation Area:导航区域选择,配合 Areas 页签使用

(二)Bake页签

  1. Agent Radius:代理半径

    决定了烘焙边缘精确度,控制平台可行走区域和边缘可行走区域

  2. Agent Height:代理高度

    决定了烘焙高度精确度,控制拱桥是否可以穿越

  3. Max Slope:最大坡度,斜坡度数

    决定了斜坡是否可以行走

  4. Step Height:最小楼梯高度

    决定了台阶是否可以行走

  5. Generated off mesh Links:生成非网格连接

    两个分开的网格之间连接相关设置

    • Drop Height:掉落高度,可以从这个高度掉下来
    • Jump Distance:跳跃距离,决定不同平面上的跳跃距离
  6. Advanced

    • Manual Voxel Size:手动设置立体像素大小

      • Voxel Size:开启前者后可以在这里设置立体像素大小,可以控制烘焙的准确度

        立体像素大小描述了生成的导航网格表示场景几何体的准确程度

        **注意:**立体像素大小减半会使内存使用量增加 4 倍,构建时间也增加 4 倍,一般情况下不需要修改这个值,除非想要极其准确的导航网格

    • Min Region Area:最小区域面积,当面积小于此处值的导航网格区域会被移除

    • Height Mesh:高度网格构建开关

      主要用来解决楼梯烘焙为斜坡时,希望在楼梯表面的位置准确的放置在楼梯平面上,而不是斜坡上

      启用它会增加烘焙时间

(三)Areas页签

  1. Name:区域名字
  2. Cost:寻路消耗

(四)Agents页签

​ 具体参数和 Bake 页签一致

二、导航网格寻路组件 (NavMesh Agent)

​ 寻路组件的作用就是帮助我们让角色可以在地形上准确的移动起来

​ 寻路组件的本质就是根据烘焙出的寻路网格信息,通过基于 A 星寻路的算法计算出行进路径让我们在该路径上移动起来

  1. Agent Type:代理类型,配合 Agents 页签使用

  2. Base Offset:基础偏移值,相对对象轴心点的高度偏移

  3. Steering:移动设置

    • Speed:寻路时的最大移动速度(世界单位/秒)

    • Angular Speed:寻路时转身的最大旋转速度(度/秒)

    • Acceleration:最大加速度(世界单位/平方秒)

    • Stopping Distance:当靠近目标点多少距离时,停止运动

    • Auto Braking:自动制动(减速)

      启用后,当到达目标时将减速,如果存在连续移动(比如巡逻移动)建议不要开启该选项

  4. Obstacle Avoidance:避障设置

    • Radius:半径,用于计算障碍物和其它寻路对象之间的碰撞
    • Height:高度,通过头顶障碍物时用于计算高度间隙使用
    • Quality:障碍躲避品质,越高躲避障碍越准确,但是性能消耗较大,如果不想主动避开其它动态障碍,可以设置为无,则只会解析碰撞
    • Priority:优先级,0~99, 避障时,数字较小的障碍物表示较高的优先级,优先级低的会忽略避障
  5. Path Finding:路径寻找规则

    • Auto Traverse OffMesh Link:是否开启自动遍历网格外的其它网格连接

      如果要自定义判断,则关闭此功能

    • Auto Repath:是否开启自动重设路线

      如果开启,当到达路径后段时会再次尝试寻路,当没有到达目标的路径时,会生成一条到达与目标位置最近的可达点

    • Area Mask:寻路时,考虑的区域

      如果寻路时不想考虑某些区域,则取消选中,塔防游戏中常见的功能

​ 代码控制:

using UnityEngine.AI;

public NavMeshAgent agent;

1.常用内容

// 自动寻路设置目标点
agent.SetDestination()

// 停止寻路
agent.isStopped = true;

2.不常用内容

// 关键变量
// 1.面板参数相关 速度 加速度 旋转速度等等
print(agent.speed);
print(agent.acceleration);
print(agent.angularSpeed);

// 2.其它重要属性
// 2-1当前是否有路径
if (agent.hasPath) { }

// 2-2代理目标点 可以设置 也可以得到
print(agent.destination);

// 2-3是否停止 可以得到也可以设置
print(agent.isStopped);

// 2-4当前路径
print(agent.path);

// 2-5路径是否在计算中
if (agent.pathPending) { }

// 2-6路径状态
print(agent.pathStatus);

// 2-7是否更新位置
agent.updatePosition = true;

// 2-8是否更新角度
agent.updateRotation = true;

// 2-9代理速度
print(agent.velocity);

// 方法

// 手动寻路
// 计算生成路径
NavMeshPath path = new NavMeshPath();
if (agent.CalculatePath(Vector3.zero, path)) { }

// 设置新路径
if (agent.SetPath(path)) { }

// 清除路径
agent.ResetPath();

// 调整到指定点位置
agent.Warp(Vector3.zero);

三、导航网格连接组件 (Off-Mesh Link)

​ 我们在烘焙地形数据的时候,可以生成网格外连接,但是它是满足条件的都会生成,而且是要在编辑模式下生成

​ 如果我们只希望两个未连接的平面之间只有有限条连接路径可以跳跃过去,并且运行时可以动态添加,就可以使用网格外连接组件,达到“指哪打哪”的效果

  1. 使用两个对象作为两个平面之间的连接点(起点和终点)

  2. 添加 Off Mesh Link 脚本进行关联

  3. 设置参数

  1. Start:起始点

  2. End:结束点

  3. Cost Override:覆盖消耗值

    负数或 0 则使用所属 Area 区域中的消耗值

    如果为正数,则使用 Area 区域寻路消耗值 × 正数代表该连接点的寻路消耗

    相当于我们可以自定义连接点的寻路消耗,主要用来解决当有"步行"和连接点都可以到达某一个目标时,希望优先选择步行区域,但是步行路径明显更远时修改该值

  4. Bi Directional:是否开启双向连接点

    开启后可以从 Start 到 End,反之也可以;如果关闭,则只能 Start 到 End

  5. Activated:是否启用该连接点

    如果关闭,则自动寻路时相当于失效

  6. Auto Update Positions:是否自动更新位置

    如果启用,当开始和结束位置改变时,导航网格也将更新

    如果不启用,即使改变了开始结束位置,也会按照刚开始的位置进行计算

四、导航网格动态障碍物组件 (NavMesh Obstacle)

​ 在游戏中常常会有这样的一个功能,场景中有一道门,如果这道门没有被破坏是不能自动导航到门后场景的,只有当这道门被破坏了,才可以通过此处前往下一场景

​ 而类似这样的物体本身是不需要进行寻路的,所以没有必要为它添加 NavMeshAgent 脚本,这时就会使用动态障碍组件实现该功能

  1. 为需要进行动态阻挡的对象添加 NavMeshObstacle 组件
  2. 设置相关参数
  3. 代码逻辑控制其的移动或者显隐

  1. Shape:动态障碍的形状

    • Capsule:胶囊
    • Box:盒状
  2. Carve:是否开启雕刻功能

    开启后,障碍物会在导航网格中挖一个孔,所谓挖孔就是会生成对应的网格信息,认为这篇区域无法前往

    如果动态障碍物是固定不动的,建议开启,比如阻碍物门木桶棚栏等等

    如果动态障碍物是频繁移动的,建议不开启该功能,比如汽车和玩家

    • Move Threshold:移动阈值,当障碍物移动超过该距离时,会认为其为移动状态,会更新移动的孔
    • Time To Stationary:障碍物作为静止状态需要等待的时间,单位为秒当静止时间超过该值会认为真正静止了
    • Carve Only Stationary:只有在静止状态时才会计算孔
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity核心10——导航寻路系统 的相关文章

  • c#获取cpu序列号

  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • unity3d 自定义的图片无法放入source image中

    须将图片的texture type改为 sprite
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • python基础编程_25_拷贝函数,copy()

    import copy a 1 2 3 4 a b b a 引用 除非直接给a重新赋值 否则a变则b变 b变则a变 c copy copy a 浅复制 只会拷贝父对象 不会拷贝父对象中的子对象 所以若a的子对象变则c 变 但是父对象变c不会
  • C++利用Poco库实现QT的信号与槽效果

    C 利用Poco库实现QT的信号与槽效果 定义信号类 信号类的使用 定义类型Model main头文件引用 main定义信号发送类 main定义信号接收类 main主函数 引用的Poco库 参考资源 C 利用Poco库实现QT的信号与槽效果
  • Python3,使用Flask来实现接口请求

    Flask之实现接口请求 1 引言 2 Flask 2 1 flask 的环境安装 2 2 flask构建web框架 2 3 flask构建get请求 2 4 flask构建post请求 2 41 代码编写 2 4 2 安装RestClie
  • j2me总结(三)

    高级界面开发 二 本编介绍高级界面下的类 1 Form Form是高级界面中最重要的类 是一个典型的容器控件类 是一个包含多个UI组件的屏幕对象 故名思意 form为表单的意思 在form中可以包含Item类 Form上的每一个元素都会分配
  • vue .number修饰符

    项目中遇到这样一个问题 某个input框用来输入价格之类的数字 我想对input的取值区间做判断 但是发现输入后变成了String类型 所以用了vue中的 number修饰符 这样就可以获得Number类型了 很方便
  • Qt 5 帮助文档的使用

    Qt 5 帮助文档的使用 Qt 5 帮助文档的使用学习图形界面开发 肯定离不开帮助文档的使用 因为它不像 C 语言那样就那么几个函数接口 图形接口的接口可以用海量来形容 常用的我们可能能记住 其它的真的没有必要去记 用到什么就去帮助文档查看
  • C++ 读写CSV文件

    include
  • Java异常之自定义异常类详解和代码举例

    Java语言的异常 异常处理机制 Java中的异常概念 1 异常是程序在运行过程中由于算法问或软件设计等问题导致的程序异常事件 2 异常的前提是可以识别并被捕获的 3 Java以面向对象的方法来处理异常的 Java提供了各种类型的异常类 4
  • 数据结构day1(2023.7.13)

    一 Xmind整理 二 课上练习 练习1 static 全局变量 局部变量作用域 int a 0 全局变量 生命周期和作用于都是从定义开始到整个文件结束 void fun int b 0 局部变量 static int c 0 局部变量 作
  • 2018第一届世界区块链大会 区块链大咖畅谈区块链宏观经济

    2018年4月24日上午 第一届世界区块链大会 三点钟峰会 W B C 在中国澳门召开 以 技术重构世界 为主题 要 驱动幸福世界 链接美好未来 大会由世界区块链联合协会首倡 世界区块链大会组委会 三点钟 深创学院主办 深圳大学区块链研究院
  • (转)找不到或无法加载主类(Could not find or load main class )

    原文 https blog csdn net shymi1991 article details 50540214 当我们试图在命令行编译运行一个简单的java程序HelloWorld java 编译命令javac HelloWorld j
  • 面经九2023.2.3上午笔试和群面

    面经九2023 2 3 上笔试和群面 1 根据指定的数据模型 完成对应SQl语句的编写 edu class表 Student表 要求1 使用左连接查询出year为2022的学生 且只查询出10条数据 插入数据 INSERT INTO ed
  • 安卓游戏辅助开发!想给金三银四找工作的程序员几点建议,面试建议

    前言 相信前几天在朋友圈晒无聊的小伙伴们 也陆续结束了假期 很多公司为了员工的健康考虑 启动了远程办公模式 床在桌边 饭在桌上 家里一切都那么安逸 专心工作真的是一件难事 远程工作最大的敌人就是 你的自制力 战胜自己 以后你一定是做成大事的
  • 面试题-Redis、MongoDB、Memcached

    一 缓存 搞懂缓存那些事 https blog csdn net a724888 article details 80785020 区别2 二 Redis MongoDB Memcached区别 区别1 https www cnblogs
  • 12、视图解析器与模板引擎

    文章目录 1 视图解析 1 1 spring boot支持的第三方模板引擎技术 1 2 视图解析原理流程 2 模板引擎 Thymeleaf 2 1 thymeleaf简介 2 2 基本语法 1 表达式 2 字面量 3 文本操作 4 数学运算
  • Python 自然语言处理 文本分类 地铁方面留言文本

    将关于地铁的留言文本进行自动分类 不要着急 一步步来 导入需要的库 import numpy as np import pandas as pd import jieba 分词 import re 正则 from fnmatch impor
  • 广西公需科目 当代科学技术前沿知识 考试答案

    用百度的识字api 可以识别广西公需科目 当代科学技术前沿知识 的文档 当代科学技术前沿知识读本 电子书 全文 pdf 这个可以在平台下载完了就识别出来就好搜答案了 自动考试视频 guagnxi视频 mp4 考试代码 for i in co
  • MySQL误删数据找回神器之binlog2sql

    一 使用前提 1 binlog format为ROW 且binlog row image为full或noblog 默认为full 2 必须开启MySQL Server 理由有如下两点 它是基于BINLOG DUMP协议来获取binlog内容
  • 笔试题目收集(2)

    笔试题目搜集系列推荐 1 笔试题目搜集1 2 笔试题目收集2 3 笔试题目搜集3 4 笔试题目搜集4 5 笔试题目搜集5 1 下列程序运行的结果 面试宝典P108 include
  • Unity核心10——导航寻路系统

    Unity 中的导航寻路系统是能够让我们在游戏世界当中 让角色能够从一个起点准确的到达另一个终点 并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往 Unity 中的导航寻路系统的本质 就是在 A 星寻路算法的基础上进行了拓展和