vault backup: 2024-10-12 17:19:45
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
# 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;
|
||||
}
|
||||
```
|
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
Binary file not shown.
After Width: | Height: | Size: 6.8 KiB |
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Reference in New Issue
Block a user