文章目录
Unity常用的寻路方式主要有以下几种:
路点寻路就是在地图上指定一些路点,让角色在路点之间移动。常用于一些固定路线的敌人或物体。
优点:路点寻路的优点是实现起来比较简单,且占用资源少、计算开销低。路线容易查看和编辑。
缺点:路线完全固定(有时会显得很僵硬),每个路点都要人为设定。容易出现绕路、走回头路和被障碍物卡住的情况。
单元格寻路就是把地图分隔为多个格子,形成一个矩阵,每个格子标注是否可移动,角色在可移动的格子内寻路。有点类似于战棋类游戏的走格子。
优点:实现简单,路线可控,障碍物可控。
缺点:单元格密度大则开销大,单元格密度小则行动很僵硬。经常出现90°转角的情况,需要做平滑处理。不适合做3D游戏。
Unity自带了一套导航系统。导航系统允许使用从场景几何体自动创建的导航网格来创建可在游戏世界中智能移动的角色。动态障碍物可让您在运行时更改角色的导航,而网格外链接 (Off-Mesh Link) 可让您构建特定动作,如打开门或从窗台跳下。本部分将详细介绍 Unity 的导航系统和寻路系统。

导航系统需要自己的数据来表示游戏场景中的可行走区域。可行走区域定义了代理可在场景中站立和移动的位置。在 Unity 中,代理被描述为圆柱体。可行走区域是通过测试代理可站立的位置从场景中的几何体自动构建的。然后,这些位置连接到场景几何体之上覆盖的表面。该表面称为导航网格(简称 NavMesh)。

导航网格将该表面存储为凸多边形。凸多边形是一种有用的表示,因为我们知道多边形内的任意两点之间没有障碍物。除了多边形边界之外,我们还存储有关哪些多边形彼此相邻的信息。这使我们能够推断整个可行走区域。
要寻找场景中两个位置之间的路径,我们首先需要将起始位置和目标位置映射到各自最近的多边形。然后,我们从起始位置开始搜索,访问所有邻居,直到我们到达目标多边形。通过跟踪被访问的多边形,我们可以找出从起点到目标的多边形序列。一种寻路的常用算法是 A*(发音为“A star”),这也是 Unity 使用的算法。


描述从起点到目标多边形的路径的多边形序列称为“走廊”(corridor)。代理将始终朝着走廊的下一个可见拐角移动,直至到达目标。如果一个简单游戏只有一个代理在场景中移动,可一次性找出走廊的所有拐角,并推动角色沿着连接拐角的线段移动。
在多个代理同时移动的情况下,它们需要在避开彼此时偏离原始路径。试图使用由线段组成的路径来纠正这种偏差很快变得非常困难并且容易出错。

由于每一帧中的代理移动距离非常小,我们可以使用多边形的连接来修复走廊,以防我们需要稍微绕道而行。然后,我们快速找到下一个需要抵达的可见拐角。

转向逻辑将采用下一个拐角的位置并基于该位置计算出到达目标所需的方向和速度。使用所需的速度移动代理可能会导致与其他代理发生碰撞。
障碍躲避系统将选择新的速度,该速度可平衡“代理在所需方向上移动”和“防止未来与其他代理及导航网格边缘发生碰撞”这两个问题。Unity 采用倒数速度障碍物 (RVO) 来预测和防止碰撞。
最后在转向和障碍躲避之后计算最终速度。在 Unity 中使用简单的动态模型来模拟代理,该模型还考虑了加速度以实现更自然和平滑的移动。
在此阶段,您可以将速度从模拟的代理提供给动画系统,从而使用根运动移动角色,或让导航系统处理该问题。
使用任一方法移动代理后,模拟代理位置将移动并约束到导航网格。最后这一小步对于实现强大的导航功能非常重要。

关于导航需要了解的最重要事项之一是全局和局部导航之间的区别。
全局导航用于在整个世界中寻找走廊。在整个世界中寻路是一项代价高昂的操作,需要相当多的处理能力和内存。
描述路径的多边形的线性列表是用于转向的灵活数据结构,并可在代理的位置移动时进行局部调整。局部导航试图确定如何有效移动到下一个拐角而不与其他代理或移动对象发生碰撞。
许多导航应用需要其他类型的障碍物而不仅仅是其他代理。这些障碍物可能是射击游戏中的常规板条箱和木桶,或者是车辆。可使用局部障碍躲避或全局寻路功能来应对障碍物。
当障碍物为移动状态时,最好使用局部障碍躲避功能进行处理。这样,代理可预测性地避开障碍物。当障碍物变为静止状态并可认为其阻挡了所有代理的路径时,障碍物应该影响全局导航,即导航网格。
更改导航网格称为“雕刻”(carving)。该过程将检测障碍物的哪些部分会接触导航网格并在导航网格中雕刻孔洞。此操作的计算成本十分高昂,因此这也是应该使用碰撞躲避功能来处理移动障碍物的另一个充分理由。

局部碰撞躲避功能也常用于绕过稀疏分散的障碍物。由于算法是局部的,因此它只考虑即将发生的碰撞,并且不能绕过陷阱或处理障碍物挡路的情况。这些情况可使用雕刻技术来解决。

导航网格多边形之间的连接是使用寻路系统内的链接描述的。有时需要让代理在不可步行位置进行导航,例如,跳过围栏或穿过关闭的门。这些情况需要知道动作的位置。
可使用网格外链接来注释这些动作;此类链接会告诉寻路器 (pathfinder) 存在一条通过指定链接的路线。稍后在跟随路径时可访问此链接,并可执行特殊动作。
前面是照搬手册中的介绍,下面上点干货。
我们模拟一个塔防游戏,先画一张简图。

然后使用MTE插件创建一张简易的地图(暂未完成),截图如下:

注意:关于MTE的使用请参考另外一篇文章:【Unity】Unity插件:地形编辑器MTE(Mesh Terrain Editor))
因为Unity中的 Navigation 不是自带的,需要我们到包管理器中去下载。步骤如下:


等待一会,Navigation 的包就下载好了。
我们在场景中建立一个空物体,下面放一个 Cube ,然后给它添加导航代理(Nav Mesh Agent),这个代理让导航系统能够帮助我们进行角色移动。

代理设置内容都很简单,先根据角色的大小,通过 Obstacle Avoidance 设置角色的半径、高度、质量等。然后通过 Steering 设置角色的移动速度、角速度、加速度等。如下图:

设置好代理后我们进行路面的烘焙。先打开烘焙窗口: Window --> AI --> Navigation 。

在 Bake 选项卡中点击 Bake 按钮进行烘焙。

烘焙结果如下:

在场景中创建一个胶囊模型,更名为 Cristal 。

创建一个名为 NavTest 的脚本,具体代码如下:
using UnityEngine;
using UnityEngine.AI;
/// <summary>
/// 寻路系统
/// </summary>
public class NavTest : MonoBehaviour
{
private NavMeshAgent agent;
public Transform target;
private void Start()
{
agent = this.GetComponent<NavMeshAgent>();
}
private void Update()
{
if (agent != null)
{
bool flag = agent.SetDestination(target.position);
}
}
}
将脚本给到刚才创建的Cube的父对象上,然后将终点的 Cristal 拖拽到脚本的 Target 属性中。

先看看固定视角的寻路。

再看看角色视角的寻路。

到这里一个简单的寻路功能就做好了。
其实除了 Unity 自带的 Navigation 功能外,还有一些插件可以使用。
在Unity Asset Store中也有很多寻路插件可以使用,其原理也大部分与其他三种寻路方式相仿,我们可以自己下载下来试试。

关于 Navigation 中代理代理及障碍物的详细讲解,请参考另一篇文章:【Unity】导航基本组件:Nav Mesh Agent、Off Mesh Link、Nav Mesh Obstacle
更多内容请查看总目录【Unity】Unity学习笔记目录整理
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注