60 lines
1.8 KiB
Markdown
Raw Normal View History

2024-10-12 17:19:46 +08:00
# Const
- **功能描述:** 表示本类的内部属性不可在蓝图中被修改,只读不可写。
- **引擎模块:** Blueprint
- **元数据类型:** bool
- **作用机制:** 在ClassFlags中添加[CLASS_Abstract](../../../../Flags/EClassFlags/CLASS_Const.md)
- **常用程度:** ★★★
表示本类的内部属性不可在蓝图中被修改,只读不可写。
继承的蓝图类也是如此。其实就是自动的给本类和子类上添加const的标志。注意只是在蓝图里检查C++依然可以随意改变遵循C++的规则。所以这个const是只给蓝图用的在蓝图里检查。函数依然可以随便调用只是没有属性的Set方法了也不能改变了。
## 示例代码:
```cpp
/*
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](image.png)
跟蓝图Class Settings里打开这个开关设定的一样
![image](image%201.png)
![Untitled](Untitled.png)
## 原理:
Const类生成的实例属性对带有const的标记从而阻止修改自身的属性。
```cpp
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;
}
```