vault backup: 2024-10-12 17:19:45
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
# 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;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 蓝图节点:
|
||||
|
||||

|
||||
|
||||
## 原理是:
|
||||
|
||||
通过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;
|
||||
```
|
Binary file not shown.
After Width: | Height: | Size: 96 KiB |
Reference in New Issue
Block a user