c++ - 如何在 C++ 宏中添加 UPROPERTY() 宏

标签 c++ properties macros unreal-engine4

我想使用 C++ 宏创建项目,如下所示:

#define PROPERTIES\
UPROPERTY(blabla)\
variableType varName;\
UPROPERTY(blabla)\
variableType2 varName2;

因此我可以向其他文件添加属性(包括此文件)并在它们上使用 PROPERTIES 宏。

class XYZ...
{

...

public:
      PROPERTIES

      ...
      UPROPERTY()
      varibleType3 name3;
      ....
}

此设计来自典型的组织,其中这些参数来自另一个类,因为它们与该类相关。

因此,我可以包含不同的文件,并包含要在编辑器中显示的所有属性。

发生的情况是,虚幻标题工具完全忽略了 UPROPERTY,当然,可能是因为它是在宏之前处理的...令人惊讶的是,它正在工作,但只有变量,而不是 UPROPERTY...所以编辑器不会显示它。

关于如何做到这一点有什么想法吗?

最佳答案

您确定您的属性定义正确吗?您应该使用类似 UPROPERTY(EditAnywhere, Category="My Category") 的内容,当向编辑器公开函数或属性时,需要 Category 。具有此宏的属性将公开给实例属性编辑器和类默认编辑器。

另外我想指出,这个设计真的很差,我认为你可能会遇到问题。正如您正确指出的那样,Epic 有自定义反射系统(UHT),它允许您使用 GC 等自动内存管理。有关构建系统的更多信息 UE Docs .

我认为您应该决定如何使用这些属性。由于您希望将它们分发给多个参与者,因此您可以选择:

  1. 继承
  2. UObject 引用
  3. 组件系统

第一个确实很琐碎,我相信你很熟悉这个概念。我认为您选择这个宏观解决方案是有原因的。 请注意,您不允许使用多重继承(这在经典 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;

第二个系统的主要优点是,您可以向需要它们的对象添加属性集,同时拥有类型安全的环境和完整的 Intellisence 支持(当然还有 UE 编辑器)。

或者您可以使用组件,这或多或少类似于第二种方法,但它可能是完全动态的(您不需要对组件的实际引用,您可以通过调用来获取它GetComponent(...))。

这三种是扩展对象属性的良好、可靠和透明的方法。通过使用您的方法,您很容易就会陷入一片困惑(如果这甚至适用于 UE 构建系统)。

关于c++ - 如何在 C++ 宏中添加 UPROPERTY() 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45942122/

相关文章:

c++ - 有条件地将一个 vector 复制到另一个 vector 的最快方法

c++ - 写出文件时出现奇怪的 glibc 错误

java - Spring 重新加载属性 - Bean 未更新

scala - 用户包含 scalamacros paradise 的最简单方法

c++ - 如何删除具有特定条件的 vector 中的所有元组?

c++ - 通过提供 DLLName 定位 DLL 路径

Java Arraylist<Object> 想要合并具有相同属性值的对象

reflection - Groovy:如何获取在基类中声明的属性

dictionary - 如何以 map 作为参数调用Freemarker宏?

rust - 为什么我们使用方括号而不是定义它的圆括号来调用 vec 宏?