UE4的AI学习(2)——官方案例实例分析
2017-10-11 11:12
399 查看
http://blog.csdn.net/a393134314/article/details/52302279
官方给出的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键可以查看,模板中已经存在,实际试验当中不需要添加。
![](https://img-blog.csdn.net/20160824174240243?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3.设置角色蓝图。具体参看官网案例,比较简单,此处不再赘述。
4.设置Blackboard资源。Blackboard里,添加三个变量,即Homelocation,TargetLocation,TargetToFollow。
5.设置AIController,此处可以按照官方的案例,创建AIController的蓝图类,也可以在C++代码里创建。需要指出的是,需要在控制器里设置行为树使用的Blackboard,以及运行的行为树,并且初始化HomeLocation。C++版本与蓝图版本本质相同,以下只给出蓝图版本。
[cpp] view
plain copy
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);
}
}
或者:
![](https://img-blog.csdn.net/20160824175517818?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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扫过的面积。
![](https://img-blog.csdn.net/20160824180439228?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160824181400113?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
(3)其中的LineTraceByChannel进行线性检测,查看AI与玩家之间是否存在阻挡物。至于为什么Trace Channel要设
置成Camera,是因为在默认情况下,Character不会Block
Visibility,但是会阻碍Camera。可以在Character蓝图中查
看相关设置。
![](https://img-blog.csdn.net/20160825113521426?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160825113928584?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
8.Task的设置,此设置可在蓝图中进行设置,可参看官方例子,也可以在C++中进行设置,参看Shooter Game的例子。没有没有需要注意的地方,看官方文档即可,此处不再赘述。
9.Decorator的设置。
10.设置行为树。设置完行为树之后,同时开启Level编辑器界面和行为树界面可以看到行为树的运行情况。
官方给出的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++版本与蓝图版本本质相同,以下只给出蓝图版本。
[cpp] view
plain copy
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编辑器界面和行为树界面可以看到行为树的运行情况。
相关文章推荐
- es的嵌套聚合、嵌套分析、下钻分析案例学习之Elasticsearch 07
- Unity官方实例教程 Roll-a-Ball 学习笔记
- Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗
- Wix学习整理(4)——关于WiX文件格式和案例HelloWorld的分析
- Echarts学习6_Echarts官方实例
- 基于R语言的Kaggle案例分析学习笔记(六)
- Jquery Ajax学习实例7-Ajax所有过程事件分析示例
- 官方NotePad实例学习--上下文菜单ContextMenu的使用
- rocketmq学习笔记 二 官方实例<消费者操作>
- awk学习心得--超详细--案例分析
- CoreData实例分析学习(1)
- 主成分分析法概述、案例实例分析
- Coursera deeplearning.ai 深度学习笔记4-2-Deep Convolutional Models Case Studies-深度卷积模型案例及代码实现
- Unity2017官方案例Survival Shooter tutorial 浅析学习
- Hadoop-HBASE案例分析-Hadoop学习笔记<二>
- 个人作业2————英语学习APP的案例分析
- input子系统学习笔记六 按键驱动实例分析下
- java学习笔记4:对象的初始化顺序(官方实例)
- 网络工程师学习资料:路由器配置案例分析
- 官方NotePad实例学习--ListActivity的使用