60 lines
1.8 KiB
Markdown
60 lines
1.8 KiB
Markdown
|
# 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; }
|
|||
|
};
|
|||
|
```
|
|||
|
|
|||
|
## 示例效果:
|
|||
|
|
|||
|
在蓝图子类中尝试修改属性会报错。
|
|||
|
|
|||
|

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

|
|||
|
|
|||
|

|
|||
|
|
|||
|
## 原理:
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
```
|