【翻译】UE4中的基础导航功能

【翻译】UE4中的基础导航功能

https://www.jianshu.com/p/12642cb3e458

简介

现今,网上有大量优秀的资源供游戏开发者学习如何使用UE4内置的AI功能。不幸的是,这些资料中,有许多已经过时了,还有的要么是教授特定的功能点,要么是大型系列教程中的一部分,甚至还有假设你拥有一些你根本不知道的知识的。

本博文系列旨在给读者提供一个可以一步步实践的示例,用的是UE4(4.17版)的AI系统。文章面向的读者群体是向中级开发者过度中的初级开发者。本文将会用蓝图和C++两种方式来介绍如何使用AI功能,每一个功能都会先给出一个蓝图的使用示例,然后用C++来实现相同的功能。

本文假设读者已经具备了基础的使用引擎和编辑器的技能,至少需要实践过蓝图快速入门指南编程快速入门这两篇文章中的内容。

目标

在接下来的几篇博文中,我们会做一个只使用AI的demo项目,项目的名称是"Game of Tag"。

我们要一步步的完成这个项目,使用的初始工程是一个几乎完全空白的项目。然后,用虚幻游戏性框架逐步完成我们的项目。

这篇文章里,我们就来看看如何使用AI驱动角色。当然,这也少不了虚幻4的导航系统(Navigation System)的帮助。

建立工程

下载初始模板

这个简单的工程里只包括了一个人体模型(从UE4模板中弄出来的)以及一个基本的角色蓝图(BP_TagCharacter)。BP_TagCharacter中设置好了网格(Mesh)和动画蓝图(Animation Blueprint),并且相关的组件也已经调整到合适状态。最后,工程还包含了一个基本的几何关卡,用来测试我们的AI。

另外,如果你在用git,你也可以从我的Bitbucket仓库中获取工程。最初的下载提示里有template标签。代码库的状态(每篇博文的最后)也会根据文章名来标记(比如basic-navigation)。

在做什么大改动之前,我们先做一个小功能——用UE4的导航系统让AI Character可以四处走动。

UE4导航系统提供了Nav Mesh(Navigation Mesh,导航网格)来确定关卡中哪些地方是可以走动的。要构建一个导航网格,我们直接添加一个NavMeshBoundsVolume就行了,注意要把它放大到包含所有可以到达的地方!

【翻译】UE4中的基础导航功能


大小调整好之后,按下P键就可以看到Nav Mesh了。

【翻译】UE4中的基础导航功能


当你把Volume添加到关卡中时,你一定注意到了有一个名为RecastNavMesh-Default的角色也被加进去了。我们可以修改这个角色的设置来看到NavMesh的不同元素。当然,我们也可以通过它来调整网格的生成方式。

【翻译】UE4中的基础导航功能


选中RecastNavMesh-Default,在细节面板中调整Agent Radius和Agent Height到44.0和192.0来适应我们的角色。这个操作会迫使NavMesh根据我们角色的尺寸来确定所有可以到达的区域。

 

设置好这两个参数之后,我们要把Cell Size的值从19.0下调到5.0来提高到达区域的精度(特别是楼梯的地方)。

 

【翻译】UE4中的基础导航功能

Cell Size 19.0

 

【翻译】UE4中的基础导航功能

Cell Size 5.0

 

生成NavMesh可能要花点时间,所以,如果游戏不需要这么高的精度,就不要去调整。当然,我们这个工程是需要的。

注意:马上测试一下你的NavMesh。它可能不会出现,或者当你模拟游戏的时候它会消失。如果出现这种情况,关闭UE4编辑器然后重新启动,然后移动一下NavMesh的位置再复原,强制编辑器重建网格。这种情况似乎是因为基于BSP/几何体的关卡会和NavMesh产生奇怪交互导致的。确保你的导航网格和上图中的一致,这样,当你按下Alt+S模拟游戏的时候,网格不会消失。

四处走动

下一步,我们要放一个简单的AI Character到游戏中让它能四处走动。比较合理的做法是,创建一个AI Controller类,这个类会随机选择一个路标,然后把角色移动到那,等待一段时间后,重复之前的行为。

先来设置路标。这个操作非常简单,在几何体面板中找到“Target Point”,拖几个到地图里就行了:

 

【翻译】UE4中的基础导航功能

 

接下来,我们要创建一个类,继承自AI Controller类,用来控制我们的AI。我会给出蓝图和C++两种实现方式,选一种你喜欢的方式尝试吧!

提示:AIController通常被用作Pawn或Character的头脑,与Player Character十分类似。它主要关心的是角色要做什么,而不是他能不能做到(也就是说,Controller应该拥有输入和智能,Pawn应该拥有游戏逻辑)。

【蓝图】AI Controller

创建一个新蓝图类,当编辑器询问继承什么父类时,展开所有类,选择AI Controller,确定,将我们的类命名为:BP_TagController。

 

【翻译】UE4中的基础导航功能

 

TagController类首先要实现的,是找到关卡中的所有路标点,然后保存起来。这一步,我们要用到Get All Actors Of Class节点:

 

【翻译】UE4中的基础导航功能


我们也要能随机获得一个路标点,所以,我们需要一个新函数:GetRandomWaypoint。(注意:我把这个函数标记为Pure,因为它不需要改变任何状态。):

【翻译】UE4中的基础导航功能

 

最后,创建一个GoToRandomWaypoint函数并且在BeginPlay中调用它:

 

【翻译】UE4中的基础导航功能


但是要怎么实现GoToRandomWaypoint函数呢?这里就要用到导航系统了。可以选择的节点有四种,取决于我们想移动到一个Actor还是一个Location,也取决于我们想使用简单的版本还是想要使用复杂的版本:

【翻译】UE4中的基础导航功能


在这里,我们用最简单的版本:Simple Move to Actor,只需提供一个随机的路标点参数:

【翻译】UE4中的基础导航功能


这样,我们的Controller就完成了!

【C++】AI Character

创建一个C++类,继承自AIController,命名为TagController。同样,在创建的时候需要展开所有类。

提示:不管什么时候,只要我引用虚幻引擎的API,我都会给出一个到线上文档的链接。点击AIController,查看我们在重写的都是些什么函数。

 

【翻译】UE4中的基础导航功能


我们的AI非常简单,只需要重写BeginPlay()函数,创建下面这些UFUNCTIONUPROPERTY

 

注意:每当我们要使用虚幻引擎提供的类时,我们都必须#include它,通常,他们是不会被默认包含的。所以,别忘了在#include"*.generated.h"之前加上#include "Runtime/Enigne/Classes/Engine/TargetPoint.h"。



作者:闪电的蓝熊猫
链接:https://www.jianshu.com/p/12642cb3e458
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。