UE4的AI学习(2)——官方案例实例分析
官方给出的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编辑器界面和行为树界面可以看到行为树的运行情况。