zoukankan      html  css  js  c++  java
  • UE4的AI学习(2)——官方案例实例分析

    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键可以查看,模板中已经存在,实际试验当中不需要添加。


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

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

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

    [cpp] view plain copy
    1. void AMyAIController::Possess(class APawn* InPawn)  
    2. {  
    3.     Super::Possess(InPawn);  
    4.    
    5.     AMyCharacter* Bot = Cast<AMyCharacter>(InPawn);  
    6.     if (Bot)  
    7.     {  
    8.         if (Bot->BehaviorTree->BlackboardAsset)  
    9.         {  
    10.             BlackboardComp->InitializeBlackboard(*Bot->BehaviorTree->BlackboardAsset);  
    11.    
    12.             /* Make sure the Blackboard has the type of bot we possessed */  
    13.             BlackboardComp->SetValueAsEnum(BotTypeKeyName, (uint8)Bot->BotType);  
    14.         }  
    15.    
    16.         BehaviorComp->StartTree(*Bot->BehaviorTree);  
    17.     }  
    18. }  
    或者:


    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编辑器界面和行为树界面可以看到行为树的运行情况。

  • 相关阅读:
    session
    CSS3盒子模型
    由“从按下回车到网页显示”粗谈网页优化
    springMVC之拦截器
    设置Webdriver启动chrome为默认用户的配置信息
    [Swift]LeetCode498. 对角线遍历 | Diagonal Traverse
    [Swift]LeetCode497. 非重叠矩形中的随机点 | Random Point in Non-overlapping Rectangles
    [Swift]通天遁地Swift
    [Swift]LeetCode996. 正方形数组的数目 | Number of Squareful Arrays
    [Swift]LeetCode995. K 连续位的最小翻转次数 | Minimum Number of K Consecutive Bit Flips
  • 原文地址:https://www.cnblogs.com/nafio/p/9137037.html
Copyright © 2011-2022 走看看