101 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

2024-10-12 17:19:46 +08:00
# HasNativeBreak
- **功能描述:** 为该结构指定一个C++内的UFunction函数作为Break节点的实现
- **使用位置:** USTRUCT
- **引擎模块:** Struct
- **元数据类型:** string="abc"
- **关联项:** [HasNativeMake](../HasNativeMake.md)
- **常用程度:** ★★★★★
为该结构指定一个C++内的UFunction函数作为Break节点的实现
指定一个static *UFunction函数的完整路径值一般是”/*Script/*Module.Class.Function”*
这个函数一般是BlueprintThreadSafe因为这种纯Make和Break函数一般不带副作用因此可以随便的多线程调用。
## 测试代码:
```cpp
//(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;
}
};
```
## 蓝图节点:
![Untitled](Untitled.png)
## 原理是:
通过Meta里配置的值去找UFunction函数因此我们配置的时候需要提供的是能找到UFunction的完整路径值。这个函数的签名会自动的被反射提取信息到UK2Node_CallFunction节点上从而构造出不同样式的Make和Break蓝图节点。
```cpp
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;
```