2.3 KiB
Raw Blame History

BlueprintInternalUseOnlyHierarchical

  • 功能描述: 在BlueprintInternalUseOnly的基础上增加了子类也不能定义新BP变量的限制。
  • 元数据类型: bool
  • 引擎模块: Blueprint
  • 作用机制: 在Meta中加入BlueprintInternalUseOnlyHierarchical
  • 常用程度:★

在BlueprintInternalUseOnly的基础上增加了子类也不能定义新BP变量的限制。

目前只找到一个用处但是也依然没有子类。如果我们在C++中定义新的子类则所有的子类都不能定义变量。注意和FTableRowBase的区别是FTableRowBase的子类依然可以定义新变量因为FTableRowBase的BlueprintInternalUseOnly标记只作用于自己。

示例代码:

USTRUCT(BlueprintInternalUseOnlyHierarchical)
struct GAMEPLAYABILITIESEDITOR_API FGameplayAbilityAuditRow : public FTableRowBase
{}

USTRUCT(BlueprintInternalUseOnly)
struct FTableRowBase
{}

原理:

只在这个地方用到GetBoolMetaDataHierarchical会检查结构的所有父类测试是否含有某个标记。所以只要有一个父类有一个这个标记就不能定义新变量。

bool UEdGraphSchema_K2::IsAllowableBlueprintVariableType(const UScriptStruct* InStruct, const bool bForInternalUse)
{
	if (const UUserDefinedStruct* UDStruct = Cast<const UUserDefinedStruct>(InStruct))
	{
		if (EUserDefinedStructureStatus::UDSS_UpToDate != UDStruct->Status.GetValue())
		{
			return false;
		}

		// User-defined structs are always allowed as BP variable types.
		return true;
	}

	// struct needs to be marked as BP type
	if (InStruct && InStruct->GetBoolMetaDataHierarchical(FBlueprintMetadata::MD_AllowableBlueprintVariableType))
	{
		// for internal use, all BP types are allowed
		if (bForInternalUse)
		{
			return true;
		}

		// for user-facing use case, only allow structs that don't have the internal-use-only tag
		// struct itself should not be tagged
		if (!InStruct->GetBoolMetaData(FBlueprintMetadata::MD_BlueprintInternalUseOnly))
		{
			// struct's base structs should not be tagged
			if (!InStruct->GetBoolMetaDataHierarchical(FBlueprintMetadata::MD_BlueprintInternalUseOnlyHierarchical))
			{
				return true;
			}
		}
	}

	return false;
}