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

news2024/11/26 2:35:00

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:只有在静止状态时才会计算孔

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

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

相关文章

国家加强互联网广告监管

我是卢松松,点点上面的头像,欢迎关注我哦! 5月1日《互联网广告管理办法》正式实施。 6月19日,市场监督总局要求加强广告监管。 主要针对直播带货广告、弹窗广告、“软文”广告等新型广告形式,加大互联网广告乱象清理…

HDLBits自学笔记3:Verilog language.Modules Hierarchy

Modules 在顶层模块中实例化模块mod_a,其端口描述: module mod_a ( input in1, input in2, output out ); module top_module ( input a, input b, output out );// 按信号名称连线mod_a u1(.in1(a),.in2(b),.out(out));// 按信号位置连线// mod_a u…

基于数据驱动 U-Net 模型的大气污染物扩散快速预测,提升计算速度近6000倍

项目背景 当前,常见的大气污染预测模型大多是基于物理机理构建的,比如空气质量预测模型 Calpuff、AERMOD、CMAQ 等。然而,这些模型运算较为复杂,对于输入数据的要求非常高,运算耗时也比较长,适合用于常规固…

【玩转Docker小鲸鱼叭】Docker镜像常用命令汇总

镜像是Docker中最为核心也是最具创造性的概念!在理解Docker的核心概念文章中,我们理解了镜像的含义,下面让我们一起操作一些镜像,包括拉取、推送镜像等操作。 1、镜像支持哪些命令 通过 docker image help 查看 Docker 支持的镜像…

联想U盘重装系统Win10步骤和详细教程

最近很多用户都在问怎么利用U盘来给联想电脑重装Win10系统,用户需要准备一个8G以上的U盘,确保联想电脑能够正常联网,然后按照小编给大家分享的联想U盘重装系统Win10步骤和详细教程操作,即可快速轻松完成联想电脑Win10系统的重装。…

C++——cin输入

cin对象在抽取过程中会进行类型转换&#xff0c;这应该是根据字节数来的&#xff0c;对于每一种类型&#xff0c;都会有相应的指令合集&#xff0c;也就是cpu会按字节进行转换&#xff0c;区别在于大端模式或者是小端模式&#xff0c;cin对象从在了<<相应的函数被称为格式…

陪诊APP开发服务兼职软件

陪诊APP是一种提供陪伴照顾服务的应用程序&#xff0c;主要面向需要医院陪护的病人及家属。以下是可能有助于陪诊APP开发服务兼职软件的功能&#xff1a; 注册和登录&#xff1a;允许用户使用手机号码等方式注册并登录账户。 病房预约&#xff1a;允许家属为病人预约病…

数据烦恼?亮数据平台为你提供一站式解决方案

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 在当今数字时代&#xff0c;大型和实时的数据集具有更全面的信息、更准确的预测、和更好的竞争优势。作为一位刚被数据折磨过的人&#xff0c;我必须要把自己的经验跟大家分享一下&#xff0c;让大家和公司在收集数据方面…

构筑数字化新引擎!美创助力金华银行核心系统国产分布式数据库迁移

近日&#xff0c;金华银行举行“星辉工程”核心项目群上线发布会&#xff0c;新一代核心系统成功部署在国产分布式数据库OceanBase&#xff0c;向业务高效创新、数智赋能迈出了重要一步。据悉&#xff0c;这是浙江省首例基于完全国产自研数据库落地的银行核心系统。 此次“星辉…

[PyTorch][chapter 43][时间序列表示方法1]

前言&#xff1a; 语言模型&#xff08;LM&#xff09;起源于语音识别(speech recognition)&#xff0c;输入一段音频数据&#xff0c;语音识别系统通常会生成多个句子作为候选&#xff0c;究竟哪个句子更合理&#xff1f;就需要用到语言模型对候选句子进行排序。 language mod…

【算法题解】40. 数组的度

这是一道 简单 题 https://leetcode.cn/problems/degree-of-an-array/ 题目 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返…

谈找工作途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉钩 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survi…

QT日历制作

文章目录 前言一、QCalendar 类介绍二、界面布局三、代码讲解1. lable 添加图片2. 设置主窗口背景色3. 日历显示改变网格线颜色4. 显示表头日期 总结 前言 在 Qt 中&#xff0c;QCalendar 类是提供日历功能的类。它用于操作和管理日期和时间信息&#xff0c;包括日期计算、日期…

为什么黑客不黑赌博软件?如何成为一名顶级黑客?

攻击了&#xff0c;只是你不知道而已&#xff01; 同样&#xff0c;对方也不会通知你&#xff0c;告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客&#xff0c;也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件&#xff1a;28岁小伙因赌博…

Java安装配置教程,2023年最新版,全部版本看这一篇就够了!!

JDK新手无脑安装配置教程❤❤❤ JDK下载网址 ps&#xff1a;如果你的JDK版本在官网没有找到&#xff0c;可以通过第三方资源进行下载&#xff0c;下载安装配置教程是通用的 官方链接>https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 安装步骤…

【Leetcode60天带刷】day17二叉树——110.平衡二叉树 , 257. 二叉树的所有路径 ,404.左叶子之和

题目&#xff1a; 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20…

SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 文章目录 新建Spring后台项目添加依赖 新建数据库IDEA 连接数据库IDEA 自动创建类实体定义数据传递至前端的格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离…

DJ4-4 NAT、ICMP、IPv6

目录 一、NAT&#xff1a;网络地址转换 1、工作原理 2、NAT 的限制 二、ICMP 1、ICMP 协议 2、ICMP 类型和代码 3、Traceroute 命令 三、IPv6 地址 1、IPv6 的引入 2、IPv6 的表示 一、NAT&#xff1a;网络地址转换 动机&#xff1a;对外部网络来讲&#xff0c;本地…

RISC-V处理器的设计与实现——基本指令集

本人小白一枚&#xff0c;在学习FPGA的过程中偶然刷到了tinyriscv这个开源项目&#xff0c;并且自己对计算机体系结构的知识也很感兴趣&#xff0c;所以想参考这个开源项目做一个基于RISC-V指令集的CPU&#xff0c;下面是tinyriscv这个开源项目的地址&#xff0c;本项目很多思路…

优思学院|六西格玛倡导者与项目赞助人是什么角色?有何区别?

倡导者&#xff08;Champion&#xff09;和项目赞助人&#xff08;Sponsor&#xff09;在正式的六西格玛的组织架构中是两个不同的角色&#xff0c;所以希望在这篇文章中解释一下两个角色的区别。 倡导者&#xff08;Champion&#xff09;是负责组织竞争力和增长的董事和高管&…