Unity Navgation系统杂记
立即停止寻路
-
使用agent.isStopped=true,可以停止寻路,但是有很大的延迟,视觉体验很不好。
-
使用agent.enabled=false,通过禁用NavMeshAgent组件的方式实现立即停止寻路。因为组件被禁用可能会产生其它问题,比如失去了Obstacle Avoidance的功能。
-
使用agent.ResetPath(),可以停止寻路,同isStopped一样,会有很大延迟。
-
使用agent.destination = agent.transform.position;虽然看起来很尴尬,但是可以满足需求。
-
使用carve,即需要为物体添加NavMeshObstacle组件,在需要停止的时候启用该组件,并设置Carve为true,同时关闭NavMeshAgent(NavMeshObstacle和NavMeshAgent两个组件无法共存)
navAgent.SetDestination(point)
若目标点point不可达,这会为你分配一个当前Navmesh上一个离目标point最近的可达点。若无可达点,这返回false。
SetDestination缓慢的问题
若有大量的角色同时寻路,且伴随carve的重建,那么寻路会很耗时,表现出的结果就是角色很卡,可以通过设置NavMesh.pathfindingIterationsPerFrame为一个很大的值来规避。
SetDestination本身是一个异步方法,unity默认是限制了其每帧执行的次数的。通过上述设置提高了每帧执行的次数,但是本质上它还是一个单线程的方法。当角色海量时,还是会大大降低游戏帧率的。
判断可达
NavMeshPath path = new NavMeshPath();agent.CalculatePath(targetPos, path);if (path.status == NavMeshPathStatus.PathComplete){//reachableagent.SetPath(path);//agent.SetDestination(targetPos);//already CalculatePath,so use SetPath is more effective than SetDestination}else{//not reachable}
设置多个寻路层
- 比如需求是寻路层有:普通道路、桥。
- 自带的默认层有Walkable、Not Walkable、Jump。在Navigation->Areas下增加新层Bridge。注意这个界面中每层的颜色最终也反应在烘焙网格的Gizmos显示中。流程如下:
- 1,为桥所在的物体添加NavMeshModifier,设置其Area Type属性为Bridge。桥所在的物体选中后,打开Navigation->Object,设置其Navigation Area为Bridge。其它行走区域设置Navigation Area为Walkable,障碍区域设置Navigation Area为Not Walkable
- 2,NavMeshSurface烘焙行走区域
- 3,为NavmeshAgent设置可行走区域,如:
agent.areaMask = 1 << 0 | 1 << 3;
- 从指定点找到导航网格中的最近点
NavMesh.SamplePosition(Vector3 sourcePosition, out AI.NavMeshHit hit, float maxDistance, int areaMask),bool True if the nearest point is found.参考:NavMesh.SamplePosition
NavMeshAgent寻路单位重叠(大量带有NavMeshAgent的单位寻路到相同点时,在寻路过程中会重叠,到达目标点后也会重叠)
方法一,使用Obstacle Avoidance。
文档中说Obstacle Avoidance使用的rvo,但是效果不是太好,实测不同物体之间碰撞后产生的推挤、抖动很严重。
如果你想各个单位能够更好的到达终点则每个单位的终点并不应该设置为同一个点,你可能需要根据每个角色的寻路半径来预先随机设置每个角色会到达的对应的位置,这样在寻路时才不会互相推挤。
方法二,使用NavMeshObstacle来挖洞。
具体流程是给物体同时挂上NavMeshAgent(不开启Obstacle Avoidance)和NavMeshObstacle组件(注意两个组件不可同时开启否则会产生不可控的瞬移)。在移动时关闭NavMeshObstacle组件,启用NavMeshAgent进行寻路;在到达目标点后先关闭NavMeshAgent,再启用NavMeshObstacle组件来挖洞,这样会对Navmesh路网进行重建,其它物体寻路路线也会变化最终会绕着目标形成包围圈。
根据上述内容知道,物体挖洞后再恢复寻路则需要禁用NavMeshObstacle,并启用NavMeshAgent。相关伪代码如下:
navObstacle.enabled=false;
navObstacle.carving=false;
navAgent.enabled=true;
然而事实是这样的话也会使物体发生不可控的瞬移,原因就是NavMeshObstacle的禁用不是立即完成的,上述代码会导致在当前帧NavMeshObstacle、NavMeshAgent都处于开启状态。因此在禁用NavMeshObstacle后必须至少延迟1帧才能开启NavMeshAgent。
参考:https://github.com/llamacademy/ai-series-part-33
其它
git上一个基于dots的nav寻路:https://github.com/dotsnav/dotsnav
相关文章:
Unity Navgation系统杂记
立即停止寻路 使用agent.isStoppedtrue,可以停止寻路,但是有很大的延迟,视觉体验很不好。 使用agent.enabledfalse,通过禁用NavMeshAgent组件的方式实现立即停止寻路。因为组件被禁用可能会产生其它问题,比如失去了Ob…...
[2021.11.9]lighteffect架构优化详细设计文档
1 lighteffect系统架构图 图1-1 整改前lighteffect系统架构图 上图为整改前lighteffect系统架构图,存在的问题如下: (1)代码bug 原因:由于系统中兼容了lighteffect和lighteffect2,写代码时只记了一个,出现代码bug。…...
经典回归算法
回归的概念 回归方程: 写成矩阵: 核心问题,构建预测函数z来映射特征矩阵x和标签y的线性关系 预测的目标值,有连续值也有离散值 连续值,就直接预测输出就行离散值,需要在输出端加一个变换函数例如。Si…...
Python两三行代码轻松批量添加~防韩还是很有必要的~
人生苦短,我用python 一直想做一个这种系列的但是因为七七八八的事情总是忘记, 今天正好有空,来开整一下~ 首先, 天冷防韩是什么梗? 【天冷防韩】 “天冷防韩”是“天冷防寒”的谐音, 不过“寒”指的…...
开心消消乐
给定一个 N 行 M 列的二维矩阵,矩阵中每个位置的数字取值为 0 或 1,矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0,规则如下: 当点击一个 1 时,该 1 被反转为 0&am…...
有效日志管理在软件开发和运营中的作用
作者:Luca Wintergerst, David Hope, Bahubali Shetti 当今存在的快速软件开发过程需要扩展和复杂的基础架构和应用程序组件,并且操作和开发团队的工作不断增长且涉及多个方面。 有助于管理和分析遥测数据的可观察性是确保应用程序和基础架构的性能和可靠…...
【五一创作】【笔记】Git|如何将仓库中所有的 commit 合成一个?又名,如何清除所有 git 提交记录?(附 git rebase 机制的简要分析)
在对代码进行开源时,我们往往并不希望代码开发过程中的提交记录被其他人看到,因为提交的过程中往往会涵盖一些敏感信息。因此会存在 将仓库中所有 commit 合成一个 的需求。 直觉上,往往会用 rebase 和 squash 或 reset,不过我尝…...
如何写出高质量代码?
作为一名资深开发人员,写出高质量的代码是我们必须要追求的目标。然而,在实际开发中,我们常常会遇到各种问题。比如,代码的可读性、可维护性、健壮性和灵活性等,这些都会影响代码的质量。那么,究竟如何才能…...
外卖项目优化-01-redis缓存短信验证码、菜品数据、Spring Cache(注解开发缓存)、(注解开发)缓存套餐数据
文章目录 外卖项目优化-01课程内容前言1. 环境搭建1.1 版本控制解决branch和tag命名冲突 1.2 环境准备 2. 缓存短信验证码2.1 思路分析2.2 代码改造2.3 功能测试 3. 缓存菜品信息3.1 实现思路3.2 代码改造3.2.1 查询菜品缓存3.2.2 清理菜品缓存 3.3 功能测试3.4 提交并推送代码…...
Chapter1:控制系统数学模型(下)
第一章:控制系统数学模型 Exercise1.13 已知控制系统结构图如下图所示,求系统的输出 C 1 ( s ) C_1(s) C...
排序算法总结
常见排序算法的时间复杂度、空间复杂度及稳定性分析: 时间复杂度空间复杂度是否有稳定性基于比较的排序算法选择排序 O(N^2)O(1)否 冒泡排序O(N^2)O(1)是插入排序O(N^2)O(1)是归并排序O(N*logN)O(N),每次需要额外一个数组用于拷贝是快排O(N*log…...
java+jsp企业物流货运快递管理系统servlet
功能需求具体描述: (1)用户功能模块包括用户登录注册,用户信息的修改,用户发布货物信息,给客服人员留言,对运输公司进行评价。 (2)企业功能模块包括企业注册登录,企业信息的修改,受理用户发布的…...
【ROS仿真实战】获取机器人在gazebo位置真值的三种方法(三)
文章目录 前言一. 使用ROS tf库二、 使用Gazebo Model Plugin三、 使用libgazebo_ros_p3d插件四、总结 前言 在ROS和Gazebo中,获取机器人的位置信息通常通过ROS消息传递进行。在这篇文章中,我们将介绍三种获取机器人在Gazebo中位置真值的方法࿱…...
Winform从入门到精通(35)——FontDialog(史上最全)
文章目录 前言一、属性1、Name2、AllowScriptChange3、AllowSimulations4、AllowVectorFonts5、AllowVerticalFonts6、Color7、FixedPitchOnly8、Font9、FontMustExist10、MaxSize11、MinSize12、 ScriptsOnly13、ShowApply14、ShowColor15、ShowEffects16、ShowHelp...
AcWing 854. Floyd求最短路Floyd模板
Floyd算法: 标准弗洛伊德算法,三重循环,基于动态规划。 循环结束之后 d[i][j]存储的就是点 i 到点 j 的最短距离。 需要注意循环顺序不能变:第一层枚举中间点,第二层和第三层枚举起点和终点。 特点: 1.复杂…...
Graph Theory(图论)
一、图的定义 图是通过一组边相互连接的顶点的集合。 In this graph, V { A , B , C , D , E } E { AB , AC , BD , CD , DE } 二、图的类型 2.1 Finite Graph A graph consisting of finite number of vertices and edges is called as a finite graph. Null Graph Tri…...
[Python]生成 txt 文件
前段时间有位客户问: 你们的程序能不能给我们生成个 txt 文件,把新增的员工都放进来,字段也不需要太多,就要 员工姓名/卡号/员工编号/员工职位/公司 这些字段就行了,然后我们的程序会去读取这个 txt 文件,拿里面的内容,读完之后会这个文件删掉 我: 可以接受延迟吗?可能没办法实…...
GeoTools实战指南: 自定义矢量样式并生成截图
GeoTools实战指南: 自定义矢量样式并生成截图 介绍 本段代码的主要功能是将矢量数据(Shapefile)渲染成一张图片。 准备环境 首先,您需要将GeoTools库添加到您的项目中。使用Maven或Gradle添加依赖项,或者直接下载GeoTools的jar文件并添加到您的类路径中。 Maven <…...
深度学习超参数调整介绍
文章目录 深度学习超参数调整介绍1. 学习率2. 批大小3. 迭代次数4. 正则化5. 网络结构总结 深度学习超参数调整介绍 深度学习模型的性能很大程度上取决于超参数的选择。超参数是指在训练过程中需要手动设置的参数,例如学习率、批大小、迭代次数、网络结构等等。选择…...
Bootloader
本篇不作太过的技术了解,仅可作为初学者的参考。用嘴简单的语言讲清楚一件事。 项目中遇到Bootloader升级MCU,我很好这是什么软件,逻辑是什么,怎么升级的。 术语及定义 指纹信息fingerprint诊断仪用于标识特定的下载尝试的信息 …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
