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诊断仪用于标识特定的下载尝试的信息 …...
终极显卡调校指南:如何用NVIDIA Profile Inspector释放游戏性能
终极显卡调校指南:如何用NVIDIA Profile Inspector释放游戏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专为NVIDIA显卡用户设计的免费优化工具&…...
合宙Air153C看门狗芯片:嵌入式系统可靠性的硬件守护方案
1. 项目概述:一颗“小而美”的国产看门狗芯片最近在做一个低功耗的户外监测设备项目,主控用的就是合宙的Air系列MCU。在调试过程中,最让我头疼的就是系统偶尔的“死机”问题。设备部署在野外,不可能每次都跑过去手动重启。正当我琢…...
Copaw_dev:AI编程助手增强框架,提升代码生成与自动化开发效率
1. 项目概述:Copaw_dev 是什么,以及它为何值得关注如果你是一名开发者,尤其是对自动化、代码生成或者AI辅助编程感兴趣,那么“Copaw_dev”这个项目标题很可能已经引起了你的注意。乍一看,这个由“G-Divine”维护的项目…...
Godot游戏引擎与强化学习结合:从零构建AI智能体的实战指南
1. 项目概述:当游戏开发遇上强化学习如果你是一名游戏开发者,或者对游戏AI的实现抱有浓厚兴趣,那么“edbeeching/godot_rl_agents”这个项目绝对值得你花时间深入研究。简单来说,这是一个将当下最热门的强化学习技术与免费、开源的…...
基于Python与Playwright的招聘信息自动化聚合与智能筛选工具实践
1. 项目概述:一个面向求职者的自动化信息聚合与投递工具最近在和一些做开发的朋友聊天,发现大家普遍有个痛点:找工作太费时间了。每天要在几个招聘App之间来回切换,重复筛选岗位、刷新列表、投递简历,机械性的操作占据…...
基于Node.js的Markdown文档自动化转换工具:从原理到CI/CD集成实战
1. 项目概述:一个被低估的文档转换利器如果你和我一样,日常工作中需要处理大量不同格式的文档,比如把Markdown写的技术文档转成Word给产品经理看,或者把项目README转成PDF存档,那你肯定也经历过格式错乱、样式丢失的烦…...
Midjourney针孔摄影风格实战手册(含--s 120+--stylize微调对照表):实测137组prompt,仅3组达成真实暗角衰减与中心锐度坍缩
更多请点击: https://intelliparadigm.com 第一章:Midjourney针孔摄影风格的本质解构 针孔摄影(Pinhole Photography)并非一种后期滤镜,而是一种基于光学物理原理的成像范式——无镜头、小孔成像、无限景深、软焦边缘…...
学生综合素质评价系统设计实现【附程序】
✨ 长期致力于综合素质评价、AHP层次分析、BP神经网络、遗传算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)三层指标体系构建与AHP动态权重分配&…...
数字电路跨时钟域信号传输:从亚稳态到同步器设计实践
1. 跨时钟域信号传输:从亚稳态到可靠同步在数字芯片和FPGA设计中,只要系统里存在多个时钟,就绕不开跨时钟域(CDC)信号传输这个经典问题。这可不是什么高深莫测的理论,而是每个硬件工程师在画第一块板子、写…...
告别SD卡!用Ubuntu主机给Jetson Orin Nano刷机,保姆级避坑指南(SDK Manager篇)
告别SD卡!用Ubuntu主机给Jetson Orin Nano刷机,保姆级避坑指南(SDK Manager篇) 当第一次拿到Jetson Orin Nano Developer Kit时,很多开发者会本能地选择SD卡刷机方案——毕竟这是最"傻瓜式"的操作。但经历过…...
