UE4 Unlua 调用异步蓝图节点AIMoveTo函数示例详解
作者:npchaha 发布时间:2022-04-12 05:35:41
标签:UE4,Unlua,AIMoveTo,异步蓝图节点
引言
异步蓝图节点:在蓝图节点的右上角有时钟图标。
注意:异步节点可以在EventGraph/Macros中使用,但是无法在蓝图函数中使用。
AIMoveTo节点:实现AI自主寻路,且能异步回调执行成功或失败的委托函数,且返回移动结果枚举值。
源码分析
AIMoveTo
蓝图节点对应C++的基类为 UK2Node_AIMoveTo
UK2Node_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
函数:该函数可触发两个多播委托 OnSuccess
和 OnFail
,正好是 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


猜你喜欢
- 前言对象关系映射(ORM)已经被使用了很长时间,以解决在编程过程中对象模型与数据模型在关系数据库中不匹配的问题。Dapper是由Stack
- 1、对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为
- 在处理网络请求时,有一部分功能是需要抽出来统一处理的,与业务隔开。登录校验可以利用spring mvc的 * Interceptor,实现H
- 自定义转换器实现参数去空格1.自定义转换器类实现Converter<S, T>类,重写convert()方法,直接上代码。/**
- 马云说:“未来最大的资源就是数据,不参与大数据十年后一定会后悔。”毕竟出自wuli马大大之口,今年二月份我开始了学习大数据的道路,直到现在对
- 10万+IT人都在关注的图片批量压缩上传方案(完整案例+代码)背景需求:为了客户端访问图片资源时,加载图片更流畅,体验更好,通常不会直接用原
- 本文需求实现了java通过方向键控制小球移动的具体过程,供大家参考,具体内容如下需求分析:第一 要画出一个小球第二 要能通过控制方向键控制它
- 批量添加,批量更新之前判断是否已经存在批量添加之前判断是否已经存在,foreach separator用UNION ALL。批量
- java实现读取、删除文件夹下的文件package test.com;import java.io.File;import java.io.
- 苹果上的UI基本上都是这个效果,然而Android机上的顶部状态栏总是和app的主题颜色不搭。还好如今的api19以上的版本,我们也能做出这
- c#做公司的应用级开发时,导出数据这个是经常要做的,公司使用的是一个叫NPOI的组件。具体是什么我就不很清楚,反正这样用就是了。具体的dll
- 一、XML DOM概述XML 文档大小写敏感、属性用引号括起来,每一个标记都要闭合。DOM是XML文档的内存中树状的表示形式。继承关系图:X
- spring 自定义让@Value解析到@Value 可以给字段赋值背景@Value通常与@PropertySource(value = “
- 前言在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时
- 我们在开发Java项目的时候,经常需要对参数进行一些必填项、格式、长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级的代码,这样
- 本文实例为大家分享了swing登录注册界面展示的具体代码,供大家参考,具体内容如下开发环境:Eclipse Neon.3 Release (
- 基于C#的Aforge类调用简单示例,供大家参考,具体内容如下由题,本程序是使用Aforge类库调用摄像头的demo。功能:1.预览2.前后
- 本文实例为大家分享了Android实现闪屏页效果的具体代码,供大家参考,具体内容如下1.效果图2.闪屏页逻辑及布局2.1 activity_
- WebService是一种跨编程语言和跨操作系统平台的远程调用技术所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一
- 方法如下:在窗体的Load事件注册滚动事件,并增加对应的方法private void FormSample_Load(object send