如何在 C++ 宏中添加 UPROPERTY() 宏
How to add UPROPERTY() macro within a c++ Macro
我想像这样使用 C++ 宏创建项目:
#define PROPERTIES\
UPROPERTY(blabla)\
variableType varName;\
UPROPERTY(blabla)\
variableType2 varName2;
因此我可以向其他文件添加属性,包括此文件并在其上使用 PROPERTIES 宏。
class XYZ...
{
...
public:
PROPERTIES
...
UPROPERTY()
varibleType3 name3;
....
}
此设计来自一个典型的组织,其中那些参数来自另一个 class,因为它们与那个 class 有关。
所以我可以包含不同的文件,并包含所有属性以在编辑器中显示。
发生的事情是 Unreal Header Tool 完全忽略了 UPROPERTY,当然,可能是因为它在宏之前被处理了......令人惊讶的是工作但只有变量,而不是 UPROPERTY......所以编辑器没有显示它。
关于如何做到这一点有什么想法吗?
您确定您的属性定义正确吗?当向编辑器公开函数或属性时,您应该使用类似 UPROPERTY(EditAnywhere, Category="My category")
Category 的东西。具有此宏的属性将公开给实例属性编辑器和 class 默认编辑器。
另外我想指出,这个设计真的很糟糕,我认为你可能有问题。正如您正确指出的那样,Epic 具有 custom 反射系统 (UHT),它允许您将自动内存管理与 GC 等结合使用。更多关于构建系统 UE Docs.
我认为您应该决定如何使用这些属性。由于您想将它们分发给多个 actor,您可以选择:
- 继承
- UObject 引用
- 组件系统
第一个真的很琐碎,我相信你对这个概念很熟悉。我认为您有选择 macro 解决方案的理由。 注意您不能使用多重继承(这在 classic C++ 中是可能的),这是由于 UBT。
第二个是这样的:
UCLASS(BlueprintType)
class UMyProps : public UObject
{
// TODO define properties in a standard way
}
// some actor's properties
UPROPERTY(BlueprintReadWrite, Category = "My Game | My Subcategory")
UMyProps* myProperties;
第二个系统的主要优点是您可以向需要它们的对象添加属性集,同时拥有类型安全的环境和完整的智能支持(当然还有 UE 编辑器)。
或者您可以使用 Components,这或多或少类似于第二种方法,但它可以是完全动态的(您不需要实际引用您的组件,您可以通过调用 GetComponent(...)
) 获得。
这三个是扩展对象属性的良好、可靠和透明的方法。通过使用你的宏的方法,你很容易以一堆乱七八糟的方式结束,如果这甚至适用于 UE 构建系统)。
我想像这样使用 C++ 宏创建项目:
#define PROPERTIES\
UPROPERTY(blabla)\
variableType varName;\
UPROPERTY(blabla)\
variableType2 varName2;
因此我可以向其他文件添加属性,包括此文件并在其上使用 PROPERTIES 宏。
class XYZ...
{
...
public:
PROPERTIES
...
UPROPERTY()
varibleType3 name3;
....
}
此设计来自一个典型的组织,其中那些参数来自另一个 class,因为它们与那个 class 有关。
所以我可以包含不同的文件,并包含所有属性以在编辑器中显示。
发生的事情是 Unreal Header Tool 完全忽略了 UPROPERTY,当然,可能是因为它在宏之前被处理了......令人惊讶的是工作但只有变量,而不是 UPROPERTY......所以编辑器没有显示它。
关于如何做到这一点有什么想法吗?
您确定您的属性定义正确吗?当向编辑器公开函数或属性时,您应该使用类似 UPROPERTY(EditAnywhere, Category="My category")
Category 的东西。具有此宏的属性将公开给实例属性编辑器和 class 默认编辑器。
另外我想指出,这个设计真的很糟糕,我认为你可能有问题。正如您正确指出的那样,Epic 具有 custom 反射系统 (UHT),它允许您将自动内存管理与 GC 等结合使用。更多关于构建系统 UE Docs.
我认为您应该决定如何使用这些属性。由于您想将它们分发给多个 actor,您可以选择:
- 继承
- UObject 引用
- 组件系统
第一个真的很琐碎,我相信你对这个概念很熟悉。我认为您有选择 macro 解决方案的理由。 注意您不能使用多重继承(这在 classic C++ 中是可能的),这是由于 UBT。
第二个是这样的:
UCLASS(BlueprintType)
class UMyProps : public UObject
{
// TODO define properties in a standard way
}
// some actor's properties
UPROPERTY(BlueprintReadWrite, Category = "My Game | My Subcategory")
UMyProps* myProperties;
第二个系统的主要优点是您可以向需要它们的对象添加属性集,同时拥有类型安全的环境和完整的智能支持(当然还有 UE 编辑器)。
或者您可以使用 Components,这或多或少类似于第二种方法,但它可以是完全动态的(您不需要实际引用您的组件,您可以通过调用 GetComponent(...)
) 获得。
这三个是扩展对象属性的良好、可靠和透明的方法。通过使用你的宏的方法,你很容易以一堆乱七八糟的方式结束,如果这甚至适用于 UE 构建系统)。