标题 | 基于Unity3D的自动寻路导航系统的研究 |
范文 | 摘要:在游戏和虚拟现实场景漫游项目中寻路导航系统应用非常广泛。实现自动寻路导航系统要有相应的算法并且需要编写大量的脚本。在Uinty3D下,使用Unity3D的AI寻路导航系统可能實现一定的自动导航功能。全文论述了在Unity3D下实现自动寻路导航系统必要条件,实现自动寻路导航的方法以及引用Al角色动画的方法。 关键词:虚拟现实;Unity3D;AI自动寻路 中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2019)36-0209-03 随着虚拟现实技术的不断更新和游戏产业的蓬勃发展。各种游戏引擎开发工具也相继产生。目前,比较流行的游戏引擎开发工具有Unity3D和虚幻引擎(UE4)。 1 Unity3D游戏引擎的简介 虽然Unity3D不带建模功能,它只有提供用于测试的几何体。但是它可以整合和编辑各种资源,最终可以实现一个可以运行的游戏项目。它除了可以应用在游戏领域之外,在房产、医疗、军事行业的虚拟现实仿真类的项目也都用得到了广泛应用。 虚幻引擎4是由美国Epic Games公司制作的优秀的游戏引擎。它在实时渲染方面具有非常强大的功能。 本文主要论述在Unity3D下实现自动寻路导航功能。 2实现自动寻路导航的必要条件 在游戏的开发中大量的存在对战问题,需要游戏角色间智能进行交互,游戏角色间可能进行跟随也可能进行攻击等的一系列自主的行为。这些都需要进行角色的寻路导航。同时,在虚拟现实场景漫游项目中也大量存在寻路导航问题。如果每一次的寻路导航都通过脚本完成,工作量非常大,费时费力效果还不一定好。Unity3D为我们提供了一套AI的寻路导航系统,通过一定的脚本编写,实现角色的巡逻、寻路和人物跟随等。 寻路算法百花齐放,各种算法各有优劣,每种算法也都有很多针对性的改进。[1]在寻路功能的没计方面,比较传统的是使用A*寻路,它是一种比较传统的人工智能算法,在游戏开发中比较常用到。A*的原理并不复杂,不过由于不是Unity3D自带功能,因此在设定网格和烘焙的过程中难免会出现问题。[2]之前unity3d用户都是用插件进行自动寻路,而如今unity3d自带了简单的自动寻路组件:Nav Mesh Agent,Off' Mesh Linkc3]。在Unity3D中完成自动寻路导航,我们一般都会使用Unity3D自带的寻路导航系统。由于寻路导航系统应用越来越广泛,Uni-ty3D官方在2017版本后把寻路导航系统单独做成了一个模块。Unity3d白带的寻路系统的原理是事先通过烘焙将地形的信息记录起来存储在Nav Mesh文件上。[4]如果要实现寻路导航功能,那么就要让AI角色对象满足以下三个条件。 2.1要让AI角色对象认知周围环境 在感知周围环境前,我们先要定义周围的环境。确定周围环境中哪些是可行走区域,哪些是不可行走区域。哪些是常规区域,哪些是特殊区域。每个区域所需要耗费多少能量。然后才能让AI角色对象感知这些周围环境。 2.2让AI角色对象确定目标位置 在AI角色感知到周围环境后,如果要能实时追踪到目标点,就要让AI对象确定目标的位置。 2.3 AI物体自身属性的设置 我们还要知道AI角色对象是哪个属性,比如它是人类,还是动物等。确定AI角色的身高,运动速度等。 3 UIuty3D下的Navigation面板和Nav Mesh Agent组件 在了解寻路导航的必要条件后,Unity3D通过的Navigation面板让AI游戏对象感知周围环境。Navigation面板是unity为我们提供的导航的面板,包含四个标签。 3.1 Agents标签,可以设定一个AI角色类型 比如说,定义人类为Human,身高为1.7米,起跳高度是l米左右,在行径中攀爬的最大角度为45等。可以根据项目的不同设定不同的角色。 3.2 Areas标签,可以设定地形 我们开发的项目中的地形是各种各样,根据不同的地域特征,Unity3D为我们设定了三十多块区域供我们进行设定。每种AI角色穿越所耗费的能量也是不一样的。如果在公路上行走,不会消耗很大的能量。如果是在沼泽地里行走会费很大的力,消耗很大的能量。 利用Areas标签,我们可以搭建一个地形区域。我们可以添加不同的区域,如添加沼泽区域,设定消耗的能量为5。默认正常走路会消耗l点能量。根据不同的地域特征,我们的设定不同的能量消耗值。这样为AI角色自动寻路提供数据计算基础。 3.3 0bject标签,可以定义地形的类型 当我们搭建好不同的地形区域和每个区域所消耗的能量后。我们需要在我们搭建的场景中定义我们搭建的类型。选择要定义的地形区域,勾选Navigation Static选项,此时在Navi-gation Area选项里,可以选择当前地形的类型。Unity3D为我们提供了三种默认类型,一种是walkable,它是可行走区域。第二种是Not Walkable不可行走区域。第三种是jump,它是可以跳跃区域。当然也可以选择我们自己定义的类型,比如沼泽区域或者水域等。 3.4 Bake标签,将AI角色和地形的参数进行烘焙 在bake标签下选择可行走区域的大小。我们现在直接点bake。烘焙出的区域用蓝色的面片显示。这个区域也就是AI角色对象所需要认知的环境。在Unity的自动寻路功能中,通过层的概念来完成对场景路径的烘焙工作。[5] Unity3D在确定AI角色自身属性时,提供了Nav MeshAgent组件,Nav Mesh Agent组件需要附着寻路的角色身上。[6]在Nav Mesh Agent组件中可以定义AI角色对象的属性。定义的属性有Agent Type根据Navigation面板下定义的Agents选择角色类型。在Steering栏目下的speed表示当前物体移动的平均速度。Angular Speed是角速度。角速度越快,在遇到90度转弯时,转弯的回头速度就越快。Acceleration是加速度。Stop-ping Distance是制动距离,它代表着,我在距离物体多远时,开始减速。Obstacle Avoidance下Radius是AI物体的半径。Height是物体的高度。这些参数都是用来定义AI角色对象的属性。 4使用c#脚本实现目标对象的追踪 在Unity3d中使用Nav Mesh各项选项设置和Java Script或者C#脚本结合的方法来实现漫游系统的白寻路功能。[7]在为AI角色赋予了自身属性以及AI角色认知周围环境后。那么AI角色需要确定追踪的目标。如果要实现确定追踪目标,我们需要写一个C#脚本。在Unity3D下创建一个C#脚本,并把这个脚本赋予AI角色上。脚本是一个组件。Unity为我们提供的组件,我们都不能深度编辑,但脚本是一个可以我们可以编辑的特殊的组件。 Unity3D在NavMeshAgent这个组件里面提供了一个方法可以找到目标物体。这个方法是publie bool SetDestination(Vec-tor3 target)。其中参数Vector3是目标点的三维向量坐标,也就是玩家的位置。在脚本中,我们需要使用Vector3传人一个三维的向量坐标,实时的传人玩家的位置。玩家的位置通过玩家的transform组件中的position获得。这样,实时追踪的脚本可写为: public class AI: MonoBehaviour {public GameObject Player; NavMeshAgent XunLu; void Update() {AIAnimator= etComponent(); XunLu= GetComponent(); XunLu.SetDestination(Player.transfo rm.position); }} 在實现AI角色追踪玩家后,我们还需要让AI角色注视着玩家。此时需要使用pubile void Look At(Veetor3 world Position)。其中参数Vector3同样是目标点的三维向量坐标。注视玩家的脚本可写为: publi{:(:lass AI: MonoBehaviour (public GameObject Player; void Update() {LookAt();} void Lx)okAt() {transform. LookAt(newVector3(Player. transform. position.x,transform.position.y, Player.transform.position.z)); }} 5使用C#脚本实现AI角色动画的调用 游戏中的非玩家角色行为主要是分为待机(idle)、巡逻(patrol)、攻击(attack)、逃跑(escape)等几个行为状态。[8]在完成AI角色对象跟随后,为AI角色添加待机动画和行走动画。在Unity3D的proj ect面板下创建动画控制器Animator Control-ler,它的作用是把一些动画通过特定的方法播放出来。在Ani-mator面板中,Entry是游戏从这里开始运行,然后去执行相对应的动画播放。我们将unity3D标准资源包里的人物待机动画和行走动画分别放到新创建的动画控制器里。作为自己制作的A1人物动画。在Animator里添加一个bool值,将bool命名为iswalk,用来控制走路动画的播放。在线条上添加一个condi-tions,当它等于true时,AI人物会行走,当它等于false时,AI人物处于待机状态。 在脚本里,我们定义一个walk()方法,当按下W键实现AI角色行走,当松开W时AI角色处于待机状态,脚本可写为: Animator AIAnimator; void walk() {if'(lnput.GetKey(KeyCode.W)) {AIAnimator.SetBool( "is,walk”, true); }if (Input.GetKeyUp(KeyCode.W》 {AIAnimator.SetBool( "iswalk”, false); }} 同样的,我们分别用S,A,D控制AI角色后退,向左,向右移动,用和按W键相似的脚本完成AI角色的待机和行走动画。 在控制AI角色待机动画和行走动画中,我们也可以使用AI角色的NavMeshAgent组件下的remainingDis,tance和stop-pingDistance变量来完成引用AI角色动画的功能。具体脚本如下: public GameObject Player; NavMeshAgent XunLu; Animator AIAnimator; void Update() {AIAnimatm= GetComponent(); XunLu=GetComponent();} private void CurrentState() {if'(XunLu.remainingDistance> XunLu.stoppingDistam:e) {AIAnimator.SetBool( "isWalk“, true);} else {print(”已经追踪到目标”); AIAnimator.SetBool( "isWalk”, false);}} 通过Unity3D的白动寻路导航系统,我们能设计制作出AI角色自动跟随功能。结合Unity3D的动画系统实现AI角色待机和行走动画,使玩家有身临其境的体验感。 6结论 我们使用Unity3D完成的自动寻路导航功能时,大大简化了脚本的编写,方便了程序开发者。但Unity3D的寻路导航系统也并不是完全智能化。Unity3D能够判断卅周围的地域,计算出最优的路线,对目标进行追踪。但还做不到设计出作战案,自动判断当前的作战路线等。但随着Unity3D版本的不断更新,Unity3D的自动寻路导航系统的功能也会不断地完善和强大。我们可以完成更加智能的寻路导航的功能。 参考文献: [1]贺小舟.交互型虚拟场景下人物的动态路径规划研究[D].中国地质大学(北京),2018:4. [2]武胜,白江波,姚浩浩,等.基于虚拟现实技术的室内导航系统[J].微型机与应用,2015,34(20):76-79. [3]倪乐波,戚鹏,遇丽娜,等.Unity3d产品虚拟展示技术的研究与应用[J].数字技术与应用,2010,(9):54-55. [4]邱建松.基于Unity3d的实时虚拟仿真系统的研究与实现[J].电子制作,2012,(12):11-12. [5]朱玉.基于Unity3D漫游系统的设计与研究[J].信息安全与技术,2014,(12):78-81. [6]沈旭霞,贾欣欣,满强,等.基于Unity3d的防喷演习系统的设计与实现[J].自动化技术与应用,2016(7):139-142. [7]朱玉.基于Unity3D漫游系統的设计与研究[J].信息安全与技术,2014,(12):78-81. [8]卢金浩,张帅,伍传敏.基于Unity3D三维游戏场景与AI系统的设计与实现[J].三明学院学报,2013(6):31-35,44. 【通联编辑:唐一东】 收稿日期:2019-08-20 基金项目:2019年宁夏工商职业技术学院科研项目课题“基于虚拟现实(VR)技术的虚拟三维数字校园漫游系统设计研究——以宁夏工商职业技术学院为例”(项目编号:NXGSKY2019-22;项目主持人:王志岗)阶段性研究成果 作者简介:王志岗(1972-),男,副教授,主要研究方向为计算机及应用。 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。