1.8 KiB
Raw Blame History

Const

  • 功能描述: 表示本类的内部属性不可在蓝图中被修改,只读不可写。
  • 引擎模块: Blueprint
  • 元数据类型: bool
  • 作用机制: 在ClassFlags中添加CLASS_Abstract
  • 常用程度: ★★★

表示本类的内部属性不可在蓝图中被修改,只读不可写。

继承的蓝图类也是如此。其实就是自动的给本类和子类上添加const的标志。注意只是在蓝图里检查C++依然可以随意改变遵循C++的规则。所以这个const是只给蓝图用的在蓝图里检查。函数依然可以随便调用只是没有属性的Set方法了也不能改变了。

示例代码:

/*
	ClassFlags:	CLASS_MatchedSerializers | CLASS_Native | CLASS_Const | CLASS_RequiredAPI | CLASS_TokenStreamAssembled | CLASS_Intrinsic | CLASS_Constructed
*/
UCLASS(Blueprintable, Const)
class INSIDER_API UMyClass_Const :public UObject
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int32 MyProperty = 123;
	UFUNCTION(BlueprintCallable)
	void MyFunc() { ++MyProperty; }
};

示例效果:

在蓝图子类中尝试修改属性会报错。

image

跟蓝图Class Settings里打开这个开关设定的一样

image

Untitled

原理:

Const类生成的实例属性对带有const的标记从而阻止修改自身的属性。

void FKCHandler_VariableSet::InnerAssignment(FKismetFunctionContext& Context, UEdGraphNode* Node, UEdGraphPin* VariablePin, UEdGraphPin* ValuePin)
{
	if (!(*VariableTerm)->IsTermWritable())
	{
		CompilerContext.MessageLog.Error(*LOCTEXT("WriteConst_Error", "Cannot write to const @@").ToString(), VariablePin);
	}
}

bool FBPTerminal::IsTermWritable() const
{
	return !bIsLiteral && !bIsConst;
}