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

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

因此,我可以向其他文件(包括此文件)添加属性,并在其上使用PROPERTIES宏。
class XYZ...
{

...

public:
      PROPERTIES

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

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

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

发生的事情是,虚幻标题工具完全忽略了UPROPERTY,当然,可能是因为它之前已经被处理过,然后Macro ...令人惊讶地起作用了,但是只有变量而不是UPROPERTY ...所以编辑器没有显示它。

有关如何执行此操作的任何想法?

最佳答案

您确定属性定义正确吗?将函数或属性公开给编辑器时,应使用诸如UPROPERTY(EditAnywhere, Category="My category") 之类的东西。是必需的。具有此宏的属性将公开给实例属性编辑器以及类默认编辑器。

我还要指出,这种设计确实很差,我认为您可能会遇到问题。正如您正确指出的那样,Epic具有自定义反射系统(UHT),使您可以将自动内存管理与GC等配合使用。有关构建系统UE Docs的更多信息。

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

  • 继承
  • UObject引用
  • 组件系统

  • 第一个确实很琐碎,我相信您对这个概念很熟悉。我认为您有理由选择该宏解决方案。 请注意,不允许您使用多重继承(在经典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 Editor)的情况下,向需要它们的对象添加属性集。

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

    这三种是扩展对象属性的良好,可靠且透明的方法。通过使用宏的方法,即使它甚至可以与UE构建系统一起使用,也很容易陷入困惑。

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

    10-10 16:43