網站首頁 編程語言 正文
引言
異步藍圖節點:在藍圖節點的右上角有時鐘圖標。
注意:異步節點可以在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
相關推薦
- 2022-06-29 python人工智能tensorflow構建卷積神經網絡CNN_python
- 2022-08-02 goFrame的gqueue與channe的區別_Golang
- 2023-02-17 docker快速部署zabbix的方法_docker
- 2022-06-23 C++11系列學習之類型推導_C 語言
- 2022-03-18 Android?Activity生命周期調用的理解_Android
- 2022-12-05 關于adfuller函數返回值的參數說明與記錄_python
- 2022-11-12 python?鏡像環境搭建總結_python
- 2022-09-12 cmd設置路由route的方法步驟_DOS/BAT
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支