80 lines
3.2 KiB
Markdown
Raw Normal View History

2024-10-12 17:19:46 +08:00
# EditInlineNew
- **功能描述:** 指定该类的对象可以在属性细节面板里直接内联创建要和属性的Instanced配合。
- **引擎模块:** Instance
- **元数据类型:** bool
- **作用机制:** 在ClassFlags中添加[CLASS_EditInlineNew](../../../../Flags/EClassFlags/CLASS_EditInlineNew.md)
- **关联项:** NotEditInlineNew (NotEditInlineNew.md)
- **常用程度:★★★★★**
指定该类的对象可以在属性细节面板里直接内联创建。
如果想在细节面板里直接创建对象属性上也必须先标记Instanced或ShowInnerProperties。
EditInlineNew主要是用在UObject的子类上一般不标EditInlineNew的是用在Actor或资产的引用上。注意EditInlineNew是表明增加从属性细节面板里直接创建对象实例的能力而非限制只能在属性细节面板里创建当然也可以自己手动NewObject再赋值给对象引用属性。
这个跟UPROPERTY上的Instanced能力是独立的。如果UCLASS上不加EditInlineNew但是属性上加上Instanced则在手动NewObject赋值该属性后该属性也会展开内部属性来提供编辑功能。因为Instanced的属性会自动的在property上加上EditInline的meta。
此说明符会传播到所有子类;子类可通过 NotEditInlineNew 说明符覆盖它。
## 示例代码:
```cpp
UCLASS(Blueprintable, EditInlineNew)
class INSIDER_API UMyClass_EditInlineNew :public UObject
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MyProperty;
};
UCLASS(Blueprintable, NotEditInlineNew)
class INSIDER_API UMyClass_NotEditInlineNew :public UObject
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MyProperty;
};
UCLASS(Blueprintable, BlueprintType)
class INSIDER_API UMyClass_Edit_Test :public UObject
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, Category = InstancedProperty)
UMyClass_EditInlineNew* MyEditInlineNew;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, Category = InstancedProperty)
UMyClass_NotEditInlineNew* MyNotEditInlineNew;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = NormalProperty)
UMyClass_EditInlineNew* MyEditInlineNew_NotInstanced;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = NormalProperty)
UMyClass_NotEditInlineNew* MyNotEditInlineNew_NotInstanced;
};
```
## 示例效果:
EditInlineNew支持直接C++或BP子类创建对象实例然后在上面编辑实例。
而NotEditInlineNew的属性则无法找到支持的类来创建对象。
如果属性上没有Instanced则只能尝试去引用找不到对象
![image](image.png)
## 原理:
判断该类是否有CLASS_EditInlineNew来决定是否可内联创建编辑。
```cpp
template <typename TClass, typename TIsChildOfFunction>
bool FPropertyEditorInlineClassFilter::IsClassAllowedHelper(TClass InClass, TIsChildOfFunction IsClassChildOf, TSharedRef< FClassViewerFilterFuncs > InFilterFuncs)
{
const bool bMatchesFlags = InClass->HasAnyClassFlags(CLASS_EditInlineNew) &&
!InClass->HasAnyClassFlags(CLASS_Hidden | CLASS_HideDropDown | CLASS_Deprecated) &&
(bAllowAbstract || !InClass->HasAnyClassFlags(CLASS_Abstract));
}
```