vault backup: 2024-10-12 17:19:45
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
# ExposedAsyncProxy
|
||||
|
||||
- **功能描述:** 在 Async Task 节点中公开此类的一个代理对象。
|
||||
- **使用位置:** UCLASS
|
||||
- **引擎模块:** Blueprint
|
||||
- **元数据类型:** string="abc"
|
||||
- **限制类型:** Async Blueprint node
|
||||
- **关联项:** [HideSpawnParms](../Param/HideSpawnParms/HideSpawnParms.md), [HasDedicatedAsyncNode](../HasDedicatedAsyncNode/HasDedicatedAsyncNode.md), [HideThen](../HideThen/HideThen.md)
|
||||
- **常用程度:** ★★★
|
||||
|
||||
在UK2Node_BaseAsyncTask中使用,用来为蓝图异步节点暴露一个异步对象引脚,以支持对这个异步行为的进一步操作。
|
||||
|
||||
在源码里的用处一是UBlueprintAsyncActionBase的子类,二是UGameplayTask子类,皆是分别会有另外的UK2Node_BaseAsyncTask以及UK2Node_LatentGameplayTaskCall来解析类的声明定义并包装生成相应的异步蓝图节点。
|
||||
|
||||
基类都是继承自UBlueprintAsyncActionBase。利用ExposedAsyncProxy 指定异步任务对象的名字。在异步蓝图节点上继续返回异步对象,可以在之后支持取消该异步操作。
|
||||
|
||||
## 测试代码:
|
||||
|
||||
UCancellableAsyncAction是引擎提供的继承自UBlueprintAsyncActionBase的一个便利的子类。UMyFunction_Async 定义了一个蓝图异步节点DelayLoop。
|
||||
|
||||
```cpp
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDelayOutputPin);
|
||||
UCLASS(Blueprintable, BlueprintType,meta = (ExposedAsyncProxy = MyAsyncObject))
|
||||
class INSIDER_API UMyFunction_Async :public UBlueprintAsyncActionBase
|
||||
{
|
||||
public:
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FDelayOutputPin Loop;
|
||||
|
||||
UPROPERTY(BlueprintAssignable)
|
||||
FDelayOutputPin Complete;
|
||||
|
||||
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject"), Category = "Flow Control")
|
||||
static UMyFunction_Async* DelayLoop(const UObject* WorldContextObject, const float DelayInSeconds, const int Iterations);
|
||||
|
||||
virtual void Activate() override;
|
||||
|
||||
UFUNCTION()
|
||||
static void Test();
|
||||
private:
|
||||
const UObject* WorldContextObject = nullptr;
|
||||
float MyDelay = 0.f;
|
||||
int MyIterations = 0;
|
||||
bool Active = false;
|
||||
|
||||
UFUNCTION()
|
||||
void ExecuteLoop();
|
||||
|
||||
UFUNCTION()
|
||||
void ExecuteComplete();
|
||||
};
|
||||
```
|
||||
|
||||
## 默认的蓝图节点是:
|
||||
|
||||
如果UMyFunction_Async 直接继承自UBlueprintAsyncActionBase,并且没有设置ExposedAsyncProxy,则生成的蓝图异步节点为为下图。
|
||||
|
||||

|
||||
|
||||
而如果继承自UCancellableAsyncAction (提供了Cancel方法),并且设置ExposedAsyncProxy 为自己想要的AsyncObject引脚名称。
|
||||
|
||||
```cpp
|
||||
UCLASS(Abstract, BlueprintType, meta = (ExposedAsyncProxy = AsyncAction), MinimalAPI)
|
||||
class UCancellableAsyncAction : public UBlueprintAsyncActionBase
|
||||
{
|
||||
UFUNCTION(BlueprintCallable, Category = "Async Action")
|
||||
ENGINE_API virtual void Cancel();
|
||||
}
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDelayOutputPin);
|
||||
UCLASS(Blueprintable, BlueprintType,meta = (ExposedAsyncProxy = MyAsyncObject))
|
||||
class INSIDER_API UMyFunction_Async :public UCancellableAsyncAction
|
||||
{}
|
||||
```
|
||||
|
||||
## 修改后的效果如下图:
|
||||
|
||||

|
||||
|
||||
## 该Meta在源码中发生的位置:
|
||||
|
||||
```cpp
|
||||
void UK2Node_BaseAsyncTask::AllocateDefaultPins()
|
||||
{
|
||||
bool bExposeProxy = false;
|
||||
bool bHideThen = false;
|
||||
FText ExposeProxyDisplayName;
|
||||
for (const UStruct* TestStruct = ProxyClass; TestStruct; TestStruct = TestStruct->GetSuperStruct())
|
||||
{
|
||||
bExposeProxy |= TestStruct->HasMetaData(TEXT("ExposedAsyncProxy"));
|
||||
bHideThen |= TestStruct->HasMetaData(TEXT("HideThen"));
|
||||
if (ExposeProxyDisplayName.IsEmpty())
|
||||
{
|
||||
ExposeProxyDisplayName = TestStruct->GetMetaDataText(TEXT("ExposedAsyncProxy"));
|
||||
}
|
||||
}
|
||||
|
||||
if (bExposeProxy)
|
||||
{
|
||||
UEdGraphPin* ProxyPin = CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Object, ProxyClass, FBaseAsyncTaskHelper::GetAsyncTaskProxyName());
|
||||
if (!ExposeProxyDisplayName.IsEmpty())
|
||||
{
|
||||
ProxyPin->PinFriendlyName = ExposeProxyDisplayName;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
```
|
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
Reference in New Issue
Block a user