UE4 Unlua 调用异步蓝图节点AIMoveTo函数示例详解

作者:npchaha 时间:2022-04-12 05:35:41 

引言

异步蓝图节点:在蓝图节点的右上角有时钟图标。

注意:异步节点可以在EventGraph/Macros中使用,但是无法在蓝图函数中使用。

AIMoveTo节点:实现AI自主寻路,且能异步回调执行成功或失败的委托函数,且返回移动结果枚举值。

源码分析

AIMoveTo 蓝图节点对应C++的基类为 UK2Node_AIMoveToUK2Node_AIMoveTo 继承至异步Task节点基类 UK2Node_BaseAsyncTask,并在构造函数中完成了对该异步基类的实例化
代码如下:

UK2Node_AIMoveTo::UK2Node_AIMoveTo(const FObjectInitializer& ObjectInitializer)
   : Super(ObjectInitializer)
{
   ProxyFactoryFunctionName = GET_FUNCTION_NAME_CHECKED(UAIBlueprintHelperLibrary, CreateMoveToProxyObject);   //确定异步调用的函数名
   ProxyFactoryClass = UAIBlueprintHelperLibrary::StaticClass();                                               //包含异步函数实现的类
   ProxyClass = UAIAsyncTaskBlueprintProxy::StaticClass();                                                     //将会被实例化的类
}

从上述代码中可以知道,AIMoveTo主要调用的函数为UAIBlueprintHelperLibrary类中的CreateMoveToProxyObject方法。

查看源码,发现CreateMoveToProxyObject方法返回值的就是一个UAIAsyncTaskBlueprintProxy实例。

以下截取部分关键代码进行分析(MyObj就是新建的UAIAsyncTaskBlueprintProxy实例):

UAIAsyncTaskBlueprintProxy* UAIBlueprintHelperLibrary::CreateMoveToProxyObject(UObject* WorldContextObject, APawn* Pawn, FVector Destination,
AActor* TargetActor, float AcceptanceRadius, bool bStopOnOverlap)
{
           ……
       FPathFollowingRequestResult ResultData = AIController->MoveTo(MoveReq);     //调用AIController相关函数进行寻路
       switch (ResultData.Code)
       {
       case EPathFollowingRequestResult::RequestSuccessful:
           MyObj->AIController = AIController;
           MyObj->AIController->ReceiveMoveCompleted.AddDynamic(MyObj, &UAIAsyncTaskBlueprintProxy::OnMoveCompleted);  //寻路请求完成后,触发OnCompleted函数
           MyObj->MoveRequestId = ResultData.MoveId;
           break;
           ……
       }
           ……
   return MyObj;
}

再看 OnMoveCompleted 函数:该函数可触发两个多播委托 OnSuccessOnFail,正好是 AIMoveTo 节点的两个异步回调引脚名:

void UAIAsyncTaskBlueprintProxy::OnMoveCompleted(FAIRequestID RequestID, EPathFollowingResult::Type MovementResult)
{
   if (RequestID.IsEquivalent(MoveRequestId) && AIController.IsValid(true))
   {
       AIController->ReceiveMoveCompleted.RemoveDynamic(this, &UAIAsyncTaskBlueprintProxy::OnMoveCompleted);
       if (MovementResult == EPathFollowingResult::Success)
       {
           OnSuccess.Broadcast(MovementResult);        //广播事件OnSuccess
       }
       else
       {
           OnFail.Broadcast(MovementResult);           //广播事件OnFail
           // ……
       }
   }
}

而这两个委托都是在类 UAIAsyncTaskBlueprintProxy 中声明的蓝图可分配委托:

UPROPERTY(BlueprintAssignable)
FOAISimpleDelegate    OnSuccess;
UPROPERTY(BlueprintAssignable)
FOAISimpleDelegate    OnFail;

总结:CreateMoveToProxyObject 函数实现寻路,UAIAsyncTaskBlueprintProxy 定义委托。

Unlua代码实现

关键代码:

function BTT_FuncName_C:ReceiveExecuteAI(OwnerController,ControlledPawn)
   ……
   --调用CreateMoveProxyObject函数实现寻路并返回UAIAsyncTaskBlueprintProxy实例
   local MoveResult = UE4.UAIBlueprintHelperLibrary.CreateMoveToProxyObject(ControlledPawn,ControlledPawn,DesLocation)      
   --在返回的实例中,绑定委托相关回调函数
   MoveResult.OnSuccess:Add(self,BTT_FuncName_C.OnAIMoveSuccess)
end
--实现回调函数
function BTT_FuncName_C:OnAIMoveSuccess(MovementResult)
   print("寻路成功")
   self:FinishExecute()
end

来源:https://juejin.cn/post/7139894911889604622

标签:UE4,Unlua,AIMoveTo,异步蓝图节点
0
投稿

猜你喜欢

  • IntelliJ IDEA中查看文件内所有已声明的方法(类似eclipse的outline)

    2021-08-06 00:39:39
  • C#生成防伪码的思路及源码分享

    2022-10-27 03:53:41
  • Android应用App更新实例详解

    2023-06-26 21:27:44
  • Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    2023-11-26 01:50:49
  • MyBatis注解CRUD与执行流程深入探究

    2023-07-03 06:19:44
  • SpringBoot 内置工具类的使用

    2021-08-26 11:42:21
  • Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例

    2023-04-11 19:43:01
  • mybatis-plus @DS实现动态切换数据源原理

    2023-07-09 21:44:23
  • 基于spring boot 的配置参考大全(推荐)

    2021-11-28 23:32:41
  • Java实现分页代码

    2023-08-05 08:14:47
  • C# 字符串的连接(实例讲解)

    2021-11-28 13:57:14
  • Minio与SpringBoot使用okhttp3问题解决

    2021-06-25 19:17:08
  • 关于MyBatis中Mapper XML热加载优化

    2023-05-20 01:49:34
  • Android编程实现将ButtonBar放在屏幕底部的方法

    2021-07-12 21:01:23
  • c# 死锁和活锁的发生及避免

    2023-05-28 00:45:49
  • winform实现五子棋游戏

    2023-05-31 19:14:24
  • java实现国产sm4加密算法

    2022-02-14 06:27:08
  • Java算法之递归算法计算阶乘

    2021-06-30 14:10:56
  • C#并行编程之信号量

    2023-10-08 19:26:54
  • Mybatis配置返回为修改影响条数方式

    2021-10-26 12:05:05
  • asp之家 软件编程 m.aspxhome.com