vault backup: 2024-10-12 17:19:45

This commit is contained in:
2024-10-12 17:19:46 +08:00
parent ff94ddca61
commit 244c0c52f6
960 changed files with 31348 additions and 10 deletions

View File

@@ -0,0 +1,104 @@
# ArraySizeEnum
- **功能描述:** 为固定数组提供一个枚举,使得数组元素按照枚举值来作为索引和显示。
- **使用位置:** UPROPERTY
- **引擎模块:** Container Property
- **元数据类型:** string="abc"
- **限制类型:** T Array[Size]
- **常用程度:** ★★★
为固定数组提供一个枚举,使得数组元素按照枚举值来作为索引和显示。
- 所谓固定数组是区别于TArray这种可以动态改变大小的数组而是平凡的用[size]直接定义的数组。这种固定数组static array因为不会增删因此才有时适合用枚举里的所有值用作下标达成更高的便利性。
- 枚举里一般会把最后一个枚举项一般叫做Max或者Sizecount之类作为数据大小值。
- 枚举里不想显示的枚举值可以用Hidden隐藏起来但因为数组下标对应的是枚举项的下标就是第几个枚举值而不是枚举项的值因此会发现数组的实际显示项目比定义的Size要小。
## 测试代码:
```cpp
UENUM(BlueprintType)
enum class EMyArrayEnumNormal :uint8
{
First,
Second,
Third,
Max,
};
UENUM(BlueprintType)
enum class EMyArrayEnumHidden :uint8
{
First,
Second,
Cat = 5 UMETA(Hidden),
Third = 2,
Max = 3,
};
UPROPERTY(EditAnywhere, Category = ArraySizeEnumTest)
int32 MyIntArray_NoArraySizeEnum[3];
UPROPERTY(EditAnywhere, Category = ArraySizeEnumTest, meta = (ArraySizeEnum = "MyArrayEnumNormal"))
int32 MyIntArray_Normal_HasArraySizeEnum[(int)EMyArrayEnumNormal::Max];
UPROPERTY(EditAnywhere, Category = ArraySizeEnumTest, meta = (ArraySizeEnum = "MyArrayEnumHidden"))
int32 MyIntArray_Hidden_HasArraySizeEnum[(int)EMyArrayEnumHidden::Max];
```
## 测试效果:
都是大小为3的固定数组。
- MyIntArray_NoArraySizeEnum是最普通的数组模样。
- MyIntArray_Normal_HasArraySizeEnum正统的使用枚举项来当数组下标的例子。可以发现下标名字不是012而是枚举项名称了。
- MyIntArray_Hidden_HasArraySizeEnum采用的枚举项里有隐藏的一项Cat但它的下标是2因为定义的顺序因此数组的第3个被隐藏了起来。
![Untitled](Untitled.png)
## 原理:
可以发现一开始判断是否是固定数组ArrayDim>1其实就是固定数组了然后通过名字找枚举以及为数组的每一项去枚举里找枚举项从而生成细节面板里的子行。
```cpp
void FItemPropertyNode::InitChildNodes()
{
if( MyProperty->ArrayDim > 1 && ArrayIndex == -1 )
{
// Do not add array children which are defined by an enum but the enum at the array index is hidden
// This only applies to static arrays
static const FName NAME_ArraySizeEnum("ArraySizeEnum");
UEnum* ArraySizeEnum = NULL;
if (MyProperty->HasMetaData(NAME_ArraySizeEnum))
{
ArraySizeEnum = FindObject<UEnum>(NULL, *MyProperty->GetMetaData(NAME_ArraySizeEnum));
}
// Expand array.
for( int32 Index = 0 ; Index < MyProperty->ArrayDim ; Index++ )
{
bool bShouldBeHidden = false;
if( ArraySizeEnum )
{
// The enum at this array index is hidden
bShouldBeHidden = ArraySizeEnum->HasMetaData(TEXT("Hidden"), Index );
}
if( !bShouldBeHidden )
{
TSharedPtr<FItemPropertyNode> NewItemNode( new FItemPropertyNode);
FPropertyNodeInitParams InitParams;
InitParams.ParentNode = SharedThis(this);
InitParams.Property = MyProperty;
InitParams.ArrayOffset = Index*MyProperty->ElementSize;
InitParams.ArrayIndex = Index;
InitParams.bAllowChildren = true;
InitParams.bForceHiddenPropertyVisibility = bShouldShowHiddenProperties;
InitParams.bCreateDisableEditOnInstanceNodes = bShouldShowDisableEditOnInstance;
NewItemNode->InitNode( InitParams );
AddChildNode(NewItemNode);
}
}
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB