3.4 KiB
3.4 KiB
HasNativeBreak
- 功能描述: 为该结构指定一个C++内的UFunction函数作为Break节点的实现
- 使用位置: USTRUCT
- 引擎模块: Struct
- 元数据类型: string="abc"
- 关联项: HasNativeMake
- 常用程度: ★★★★★
为该结构指定一个C++内的UFunction函数作为Break节点的实现
指定一个static *UFunction函数的完整路径值,一般是”/*Script/Module.Class.Function”
这个函数一般是BlueprintThreadSafe,因为这种纯Make和Break函数一般不带副作用,因此可以随便的多线程调用。
测试代码:
//(BlueprintType = true, HasNativeBreak = /Script/Insider.MyHasNativeStructHelperLibrary.BreakMyHasNativeStruct, HasNativeMake = /Script/Insider.MyHasNativeStructHelperLibrary.MakeMyHasNativeStruct, ModuleRelativePath = Struct/MyStruct_NativeMakeBreak.h)
USTRUCT(BlueprintType, meta = (HasNativeBreak = "/Script/Insider.MyHasNativeStructHelperLibrary.BreakMyHasNativeStruct", HasNativeMake = "/Script/Insider.MyHasNativeStructHelperLibrary.MakeMyHasNativeStruct"))
struct INSIDER_API FMyStruct_HasNative
{
GENERATED_BODY()
UPROPERTY(BlueprintReadWrite, EditAnywhere)
float MyReadWrite;
UPROPERTY(BlueprintReadOnly, EditAnywhere)
float MyReadOnly;
UPROPERTY(EditAnywhere)
float MyNotBlueprint;
};
USTRUCT(BlueprintType)
struct INSIDER_API FMyStruct_HasDefaultMakeBreak
{
GENERATED_BODY()
UPROPERTY(BlueprintReadWrite, EditAnywhere)
float MyReadWrite;
UPROPERTY(BlueprintReadOnly, EditAnywhere)
float MyReadOnly;
UPROPERTY(EditAnywhere)
float MyNotBlueprint;
};
UCLASS()
class UMyHasNativeStructHelperLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintPure, meta = (BlueprintThreadSafe))
static void BreakMyHasNativeStruct(const FMyStruct_HasNative& myStruct, float& outValue)
{
outValue = myStruct.MyReadWrite + myStruct.MyReadOnly + myStruct.MyNotBlueprint;
}
UFUNCTION(BlueprintPure, meta = (BlueprintThreadSafe))
static FMyStruct_HasNative MakeMyHasNativeStruct(float value)
{
FMyStruct_HasNative result;
result.MyReadWrite = value;
result.MyReadOnly = value;
result.MyNotBlueprint = value;
return result;
}
};
蓝图节点:
原理是:
通过Meta里配置的值去找UFunction函数,因此我们配置的时候需要提供的是能找到UFunction的完整路径值。这个函数的签名会自动的被反射提取信息到UK2Node_CallFunction节点上,从而构造出不同样式的Make和Break蓝图节点。
E:\P4V\Engine\Source\Editor\BlueprintGraph\Private\EdGraphSchema_K2.cpp
const FString& MetaData = StructType->GetMetaData(FBlueprintMetadata::MD_NativeMakeFunction);
const UFunction* Function = FindObject<UFunction>(nullptr, *MetaData, true);
UK2Node_CallFunction* CallFunctionNode;
if (Params.bTransient || Params.CompilerContext)
{
CallFunctionNode = (Params.bTransient ? NewObject<UK2Node_CallFunction>(Graph) : Params.CompilerContext->SpawnIntermediateNode<UK2Node_CallFunction>(GraphNode, Params.SourceGraph));
CallFunctionNode->SetFromFunction(Function);
CallFunctionNode->AllocateDefaultPins();
}
else
{
FGraphNodeCreator<UK2Node_CallFunction> MakeStructCreator(*Graph);
CallFunctionNode = MakeStructCreator.CreateNode(false);
CallFunctionNode->SetFromFunction(Function);
MakeStructCreator.Finalize();
}
SplitPinNode = CallFunctionNode;