官方给出的AI实例是实现一个跟随着玩家跑的AI,当玩家没有在AI视野里时,它会继续跑到最后看到玩家的地点,等待几秒后如果仍然看不到玩家,则跑回初始地点。官方的案例已经讲得比较详细,对于一些具体的函数调用,官方没有进一步讲解,本文作为官方案例的一个补充,提供给有兴趣的朋友参考。

一、整体思路分析

一个整体的思路是,用一个Service检测附近是否有出现在AI里的玩家,如果有的话,则将TargetToFollow设为该对象,然后跑向该对象(RapidMoveTo,注意,不是跑向玩家所在位置,而是跑向玩家),如果没有的话,则将TargetToFollow置为空,然后跑向(MoveTo)玩家最后出现的位置(TargetLocation),否则,跑回(MoveTo)HomeLocation。也就是说,1.建立一个Blackboard记录数据,2.需要实现一个Service来检测AI附近并且出现在AI视野里的玩家,3.实现一个Task(RapidMoveTo),使得AI跑向玩家,4.实现一个Task,使得AI跑回初始地点(MoveTo 已在引擎中实现)5.实现一个Decorator节点,判断AI是否已经离玩家的距离较近,如果较近,在停止活动。

二、每个步骤的分析

1.建立Top-Down模板,此处不再赘述。

2.建立寻路网络边界体积框,AI只会在此框内进行寻路,按p键可以查看,模板中已经存在,实际试验当中不需要添加。

3.设置角色蓝图。具体参看官网案例,比较简单,此处不再赘述。

4.设置Blackboard资源。Blackboard里,添加三个变量,即Homelocation,TargetLocation,TargetToFollow。

5.设置AIController,此处可以按照官方的案例,创建AIController的蓝图类,也可以在C++代码里创建。需要指出的是,需要在控制器里设置行为树使用的Blackboard,以及运行的行为树,并且初始化HomeLocation。C++版本与蓝图版本本质相同,以下只给出蓝图版本。

void AMyAIController::Possess(class APawn* InPawn)
{
Super::Possess(InPawn); AMyCharacter* Bot = Cast<AMyCharacter>(InPawn);
if (Bot)
{
if (Bot->BehaviorTree->BlackboardAsset)
{
BlackboardComp->InitializeBlackboard(*Bot->BehaviorTree->BlackboardAsset); /* Make sure the Blackboard has the type of bot we possessed */
BlackboardComp->SetValueAsEnum(BotTypeKeyName, (uint8)Bot->BotType);
} BehaviorComp->StartTree(*Bot->BehaviorTree);
}
}

或者:

6.放置AI角色,拖住蓝图脚本放进Level Editor即可。

7.设置Service节点。其中需要注意的是:

(1)官方案例中,使用一个AI_CON_Ref的变量保存AIController的引用,可以进一步使用Event Receive Tick的AI版本,可以直接得到AIController的引用,连变量都省了。

(2)案例中使用MultiSphereTraceForObject进行附近是否存在玩家的检测。其中的Radius是球形的半径,ObjectTypes是需要检测的类型,Actors to Igonore是不需要检测的类型。而它的检测路径如第二张图,即为一个半径为Radius的球体从Start移动到end扫过的面积。

(3)其中的LineTraceByChannel进行线性检测,查看AI与玩家之间是否存在阻挡物。至于为什么Trace Channel要设

置成Camera,是因为在默认情况下,Character不会Block Visibility,但是会阻碍Camera。可以在Character蓝图中查

看相关设置。

8.Task的设置,此设置可在蓝图中进行设置,可参看官方例子,也可以在C++中进行设置,参看Shooter Game的例子。没有没有需要注意的地方,看官方文档即可,此处不再赘述。

9.Decorator的设置。

10.设置行为树。设置完行为树之后,同时开启Level编辑器界面和行为树界面可以看到行为树的运行情况。

UE4的AI学习(2)——官方案例实例分析的更多相关文章

  1. UE4的AI学习(1)——基本概念

    AI学习当中,不学习行为树基本概念就不能明白具体实例中的操作意义,但是没有经过具体实例实验,又觉得基本概念抽象难以理解.建议先泛读(1)(2)后再对具体的细节进行死磕,能较深的理解行为树的具体概念.第 ...

  2. spark SQL学习(综合案例-日志分析)

    日志分析 scala> import org.apache.spark.sql.types._ scala> import org.apache.spark.sql.Row scala&g ...

  3. Python学习之温度转换实例分析篇

    #TempConvert.py Tempstr=input('请输入要转换的温度值:') if Tempstr[-1] in ['C','c']: F=1.8*eval(Tempstr[0:-1])+ ...

  4. AI 学习路线

    [导读] 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献,内容涵盖AI入门基础知识.数据分析挖掘.机器学习.深度学习.强化学习.前 ...

  5. 【摸鱼向】UE4的AI模块探索手记(1)

    前言 之前实现了自主创作的角色导入进UE4并成功控制其进行一系列动作,但目前的样子距离基本的游戏架构还差了一个很大的模块:NPC,而这部分是由电脑来进行自动控制,所以,我有一句话不知当讲不当讲(对,我 ...

  6. 通过angularJS官方案例快速入门

    官方案例-angular-phonecat angularJS官方提供了一个官方案例给大家进行循序渐进的学习,但是如果之前没有接触过node.js以及git的同学这个案例拿着也无从下手-这里就介绍一下 ...

  7. Selenium2学习-014-WebUI自动化实战实例-012-Selenium 操作下拉列表实例-div+{js|jquery}

    之前已经讲过了 Selenium 操作 Select 实现的下拉列表:Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select,但是在实际的日 ...

  8. AI - 学习路径(Learning Path)

    初见 机器学习图解 错过了这一篇,你学机器学习可能要走很多弯路 这3张脑图,带你清晰人工智能学习路线 一些课程 Andrew Ng的网络课程 HomePage:http://www.deeplearn ...

  9. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

随机推荐

  1. Delphi中的构造函数的override的问题

    TObject的构造方法Create不能被override.因为它是一个静态方法.

  2. python之小应用:读取csv文件并处理01数据串

    目的:读取csv文件内容,把0和1的数据串取出来,统计出现1的连续次数和各次数出现的频率次数 先读取csv文件内容: import csv def csv_read(file): list = [] ...

  3. codeforces 1051 D. Bicolorings (DP)

    D. Bicolorings time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  4. HDU-1686-KMP-水题

    纯KMP #include <cstdio> #include <algorithm> #include <cstring> #include <ctype. ...

  5. jasperReport和Ireport

    <!-- groovy --> <dependency> <groupId>org.codehaus.groovy</groupId> <arti ...

  6. [luogu1373]小a和uim之大逃离【动态规划】

    传送门:https://www.luogu.org/problemnew/show/P1373 定义状态是:\(f[i][j][h][0..1]\)表示在\([i,j]\)两个人相差为h,让某一个人走 ...

  7. docker安装Zabbix

    1. 先安装数据库mysqldocker run --name zabbix-mysql-server --hostname zabbix-mysql-server \-e MYSQL_ROOT_PA ...

  8. Gym 100971J-Robots at Warehouse

    题目链接:http://codeforces.com/gym/100971/problem/J Vitaly works at the warehouse. The warehouse can be ...

  9. C# try catch语句&获取随机数的方法

    try catch语句: try{ //无论如何都会走,必须写: } catch(Exception a){ //Exception报异常,需要定义,需要写输出语句: //如果上面执行失败走,必须写: ...

  10. myeclipse如何设置或关闭断点调试自动跳入debug模式

    遇到了很坑的问题,在myeclipse(eclipse应该也一样)开发过程中,打了断点调试,最初时候会弹出一个弹出框,让你选择是否进入debug模式,结果一不小心点了一个记住选择,然后选择了yes,结 ...