当前位置: 首页 > news >正文

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&#xff0c;可以停止寻路&#xff0c;但是有很大的延迟&#xff0c;视觉体验很不好。 使用agent.enabledfalse&#xff0c;通过禁用NavMeshAgent组件的方式实现立即停止寻路。因为组件被禁用可能会产生其它问题&#xff0c;比如失去了Ob…...

[2021.11.9]lighteffect架构优化详细设计文档

1 lighteffect系统架构图 图1-1 整改前lighteffect系统架构图 上图为整改前lighteffect系统架构图&#xff0c;存在的问题如下&#xff1a; (1)代码bug 原因&#xff1a;由于系统中兼容了lighteffect和lighteffect2&#xff0c;写代码时只记了一个&#xff0c;出现代码bug。…...

经典回归算法

回归的概念 回归方程&#xff1a; 写成矩阵&#xff1a; 核心问题&#xff0c;构建预测函数z来映射特征矩阵x和标签y的线性关系 预测的目标值&#xff0c;有连续值也有离散值 连续值&#xff0c;就直接预测输出就行离散值&#xff0c;需要在输出端加一个变换函数例如。Si…...

Python两三行代码轻松批量添加~防韩还是很有必要的~

人生苦短&#xff0c;我用python 一直想做一个这种系列的但是因为七七八八的事情总是忘记&#xff0c; 今天正好有空&#xff0c;来开整一下~ 首先&#xff0c; 天冷防韩是什么梗&#xff1f; 【天冷防韩】 “天冷防韩”是“天冷防寒”的谐音&#xff0c; 不过“寒”指的…...

开心消消乐

给定一个 N 行 M 列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为 0 或 1&#xff0c;矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0&#xff0c;规则如下&#xff1a; 当点击一个 1 时&#xff0c;该 1 被反转为 0&am…...

有效日志管理在软件开发和运营中的作用

作者&#xff1a;Luca Wintergerst, David Hope, Bahubali Shetti 当今存在的快速软件开发过程需要扩展和复杂的基础架构和应用程序组件&#xff0c;并且操作和开发团队的工作不断增长且涉及多个方面。 有助于管理和分析遥测数据的可观察性是确保应用程序和基础架构的性能和可靠…...

【五一创作】【笔记】Git|如何将仓库中所有的 commit 合成一个?又名,如何清除所有 git 提交记录?(附 git rebase 机制的简要分析)

在对代码进行开源时&#xff0c;我们往往并不希望代码开发过程中的提交记录被其他人看到&#xff0c;因为提交的过程中往往会涵盖一些敏感信息。因此会存在 将仓库中所有 commit 合成一个 的需求。 直觉上&#xff0c;往往会用 rebase 和 squash 或 reset&#xff0c;不过我尝…...

如何写出高质量代码?

作为一名资深开发人员&#xff0c;写出高质量的代码是我们必须要追求的目标。然而&#xff0c;在实际开发中&#xff0c;我们常常会遇到各种问题。比如&#xff0c;代码的可读性、可维护性、健壮性和灵活性等&#xff0c;这些都会影响代码的质量。那么&#xff0c;究竟如何才能…...

外卖项目优化-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...

排序算法总结

常见排序算法的时间复杂度、空间复杂度及稳定性分析&#xff1a; 时间复杂度空间复杂度是否有稳定性基于比较的排序算法选择排序 O(N^2)O(1)否 冒泡排序O(N^2)O(1)是插入排序O(N^2)O(1)是归并排序O(N*logN)O(N)&#xff0c;每次需要额外一个数组用于拷贝是快排O(N*log…...

java+jsp企业物流货运快递管理系统servlet

功能需求具体描述&#xff1a; (1)用户功能模块包括用户登录注册&#xff0c;用户信息的修改&#xff0c;用户发布货物信息&#xff0c;给客服人员留言&#xff0c;对运输公司进行评价。 (2)企业功能模块包括企业注册登录&#xff0c;企业信息的修改&#xff0c;受理用户发布的…...

【ROS仿真实战】获取机器人在gazebo位置真值的三种方法(三)

文章目录 前言一. 使用ROS tf库二、 使用Gazebo Model Plugin三、 使用libgazebo_ros_p3d插件四、总结 前言 在ROS和Gazebo中&#xff0c;获取机器人的位置信息通常通过ROS消息传递进行。在这篇文章中&#xff0c;我们将介绍三种获取机器人在Gazebo中位置真值的方法&#xff1…...

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算法&#xff1a; 标准弗洛伊德算法&#xff0c;三重循环&#xff0c;基于动态规划。 循环结束之后 d[i][j]存储的就是点 i 到点 j 的最短距离。 需要注意循环顺序不能变&#xff1a;第一层枚举中间点&#xff0c;第二层和第三层枚举起点和终点。 特点&#xff1a; 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. 网络结构总结 深度学习超参数调整介绍 深度学习模型的性能很大程度上取决于超参数的选择。超参数是指在训练过程中需要手动设置的参数&#xff0c;例如学习率、批大小、迭代次数、网络结构等等。选择…...

Bootloader

本篇不作太过的技术了解&#xff0c;仅可作为初学者的参考。用嘴简单的语言讲清楚一件事。 项目中遇到Bootloader升级MCU&#xff0c;我很好这是什么软件&#xff0c;逻辑是什么&#xff0c;怎么升级的。 术语及定义 指纹信息fingerprint诊断仪用于标识特定的下载尝试的信息 …...

安卓开发_广播机制_广播的最佳实践:实现强制下线功能

安卓开发_广播机制_广播的最佳实践&#xff1a;实现强制下线功能 ActivityCollector类用于管理所有的ActivityBaseActivity类作为所有Activity的父类创建一个LoginActivity来作为登录界面布局LoginActivity 在MainActivity中加入强制下线功能布局MainActivity在BaseActivity中注…...

国民技术N32G430开发笔记(10)- IAP升级 Application 的制作

IAP升级 Application 的制作 1、App程序跟Bootloader程序最大的区别就是&#xff0c; 程序的执行地址变成了之前flash设定的0x08006000处&#xff0c; 大小限制为20KB 所以修改Application工程的ld文件 origin 改成 0x08006000 length 改成0x5000 烧录是起始地址也要改为x0x…...

[计算机图形学]材质与外观(前瞻预习/复习回顾)

一、图形学中的材质 不同的物体表面有着不同的材质&#xff0c;而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数&#xff0c;叫做BRDF&#xff0c;而在实际上&#xff0c;也就是BRDF定义了不同的材质。BRDF决定了光如何被反…...

Java 的简要介绍及开发环境的搭建(超级详细)

图片来源于互联网 目录 | CONTENT Java 简介 一、什么是 Java 二、认识 Java 版本 三、选择哪个版本比较好 搭建 Java 开发环境 一、下载 Java 软件开发工具包 JDK 二、配置环境变量 自动配置 手动配置 三、下载合适的 IDE IntelliJ IDEA Visual Studio Code Eclip…...

每天一道算法练习题--Day15 第一章 --算法专题 --- -----------二叉树的遍历

概述 二叉树作为一个基础的数据结构&#xff0c;遍历算法作为一个基础的算法&#xff0c;两者结合当然是经典的组合了。很多题目都会有 ta 的身影&#xff0c;有直接问二叉树的遍历的&#xff0c;有间接问的。比如要你找到树中满足条件的节点&#xff0c;就是间接考察树的遍历…...

golang - 函数的使用

核心化编程 为什么需要函数&#xff1f; 代码冗余问题不利于代码维护函数可以解决这个问题 函数 函数&#xff1a;为完成某一功能的程序指令&#xff08;语句&#xff09;的集合&#xff0c;称为函数 在 Go 中&#xff0c;函数分为&#xff1a;自定义函数&#xff08;自己写…...

真题详解(极限编程)-软件设计(六十一)

真题详解&#xff08;二分查找平均值&#xff09;-软件设计&#xff08;六十)https://blog.csdn.net/ke1ying/article/details/130417464 VLANtag属于 数据链路层实现。 数据链路层&#xff1a;网桥交换机。 网络层&#xff1a;路由器。 物理层&#xff1a;中继器。 Telent…...

计算机网络笔记:TCP粘包

默认情况下, TCP 连接会启⽤延迟传送算法 (Nagle 算法), 在数据发送之前缓存他们. 如果短时间有多个数据发送, 会缓冲到⼀起作⼀次发送 , 这样可以减少 IO 消耗提⾼性能。 如果是传输⽂件的话, 那么根本不⽤处理粘包的问题, 来⼀个包拼⼀个包就好了。但是如果是多条消息, 或者…...

Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)

一、ref&#xff08;打标识&#xff09; 前面提及到了标签属性&#xff1a;keys 这里将了解ref&#xff1a;打标识 正常布置脚手架并创建入口文件main.js,引入组件 1. 可以给元素注册引用信息&#xff08;获取真实DOM&#xff09; 给一个按钮获取上方的dom的方法&#xff0c;方…...

数仓建设规划核心问题!

小A进入一家网约车出现服务公司&#xff0c;负责公司数仓建设&#xff0c;试用期主要一项 OKR是制定数据仓库建设规划&#xff1b;因此小 A 本着从问题出发为原点&#xff0c;先对公司数仓现状进行一轮深入了解&#xff0c;理清存在问题&#xff0c;然后在以不忘初心原则提出解…...

网站建设技术公司/百度seo网站优化服务

在"storm源码分析之topology提交过程"一文最后&#xff0c;submitTopologyWithOpts函数调用了mk-assignments函数。该函数的主要功能就是进行topology的任务分配&#xff08;task assignment&#xff09;。mk-assignments函数定义如下&#xff1a; ;; get existing a…...

外包网站建设公司/网站优化主要优化哪些地方

前言 前面我们讲了阻塞队列&#xff0c;阻塞队列使用put/take方法可以实现在队列已满或空的时候达到线程阻塞状态&#xff0c;阻塞这种方式在线程并发时固然安全&#xff0c;但是也会造成效率上的问题&#xff0c;所以说今天我们来讲一个非阻塞队列——ConcurrentLinkedQueue&…...

wordpress 取消评论/免费seo教程

首先生成两张数据表,一般要实现两张数据表之间的联系要建立第三张表&#xff0c;如下 数据表生成之后&#xff0c;生成一些测试数据&#xff0c;接下来就对表article_tag表进行操作 在模型文件中声明两张表之间的关系&#xff1a; 测试数据&#xff1a; 转载于:https://www.cnb…...

加强政府网站建设/海外广告优化师

欢迎关注专栏&#xff1a;Java架构技术进阶。里面有大量batj面试题集锦&#xff0c;还有各种技术分享&#xff0c;如有好文章也欢迎投稿哦。 Spring简介 Spring 是一个开源框架&#xff0c;是一个分层的 JavaEE 一站式框架。 所谓一站式框架是指 Spring 有 JavaEE 开发的每一层…...

昆明网站建设哪家合适/app推广平台

Shutdownnormal:等待所有用户断开连接时&#xff0c;关闭数据库、卸载数据库和关闭实例。immediate&#xff1a;回滚所有用户事务&#xff0c;关闭数据库、卸载数据库和关闭实例.(注意是回滚)。transactional&#xff1a;当所有用户事务结束时&#xff0c;关闭数据库、卸载数据…...

那个网站可以做宣传/培训机构网站制作

P2P点对点 控制 语音G711 mp4 avi编解码 ffmpeg解码264 中英文界面切换 avh.avd录像 vfw avi c语言udp server client 宫格 通道 mfc界面 单界面属性 转载于:https://www.cnblogs.com/hshy/p/10760134.html...