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

时间:2017-08-29 14:45:57

标签: 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 ......所以编辑器没有展示它。

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:2)

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

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

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

  1. 继承
  2. UObject参考
  3. 组件系统
  4. 第一个是非常微不足道的,我相信你熟悉这个概念。而且我认为您有理由选择解决方案。 注意您不能使用多重继承(这在经典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构建系统,您可能很容易陷入困境。