官方给出的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. html web服务器

    web服务器可以发布网站,从而使得网站可以被全世界访问: 在自己服务器上托管自己的网站的要求: 硬件搭建:强大的服务器硬件,保证24小时高速连接, 软件搭建:服务器授权比客户端授权更贵: 人工费:环境 ...

  2. 写给正在入坑linux系统的伙伴

    光阴似箭,时光如梭,转年出来工作已经3年了.从一个职场新人慢慢熟悉职场的工作方式,适应职场工作的环境,学习了很多知识,也总结了很多经验.现在的目标就是一步一个脚印,慢慢打磨自己,希望早日成为取代其他人 ...

  3. BZOJ2049[Sdoi2008]洞穴勘测——LCT

    题目描述 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如 ...

  4. mvc Filters 过滤器

    项目需要控制controller和action的访问权限. 看了下资料,发觉还是很方便的. 首先在mvc项目下创建一个文件夹 Filters, 然后在Filters中创建一个类.代码如下 namesp ...

  5. day21 正则表达式

    正则表达式 简单的范围的字符组 0-9 匹配所有的数字 a-z 匹配所有的小写字母 A-Z 匹配所有的大写字母 A-Za-z 匹配所有的字母 字符 . 换行符以外的任意字符 \w word 匹配数字, ...

  6. android handler msg的使用 实现进度条

    package com.app.threadtest; import android.app.Activity; import android.os.Bundle; import android.os ...

  7. Windows 10更新时出现0x80070422错误

    Windows更新 更新状态 安装更新时出现一些问题,但我们稍后会重试.如果你继续看到此错误,并想要搜索Web或联系支持人员以获取相关信息,一下信息可能会对你有帮助:(0x80070422) 分析原因 ...

  8. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  9. C# 面向对象的封装、继承、多态

    一.封装: 封装:把客观的事物封装成类,使用和修改方便: 作用和结构体使用方法相似,程序执行流程不同: 要点:成员变量,属性,成员方法,构造函数,成员方法的静态和非静态,命名空间,常用的访问修饰符pu ...

  10. [Offer收割]编程练习赛13 解题报告

    http://hihocoder.com/contest/offers13/problems 题目1 : 风格不统一如何写程序 首先:输入保证组成变量名的单词只包含小写字母. 做法:只要对不同的部分进 ...