【问题标题】:How to add UPROPERTY() macro within a c++ Macro如何在 C++ 宏中添加 UPROPERTY() 宏
【发布时间】:2018-02-07 02:07:10
【问题描述】:

我想要使用这样的 c++ 宏创建项目:

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

所以我可以将属性添加到包括这个在内的其他文件并在它们上使用 PROPERTIES 宏。

class XYZ...
{

...

public:
      PROPERTIES

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

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

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

发生的事情是Unreal Header Tool完全忽略了UPROPERTY,当然,可能是因为它之前正在处理然后宏......令人惊讶的是工作但只有变量,而不是UPROPERTY......所以编辑器没有显示出来。

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

【问题讨论】:

    标签: c++ properties macros unreal-engine4


    【解决方案1】:

    您确定您的属性定义正确吗?将函数或属性公开给编辑器时,您应该使用 UPROPERTY(EditAnywhere, Category="My category") Category 之类的东西。带有此宏的属性将暴露给实例属性编辑器和类默认值编辑器。

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

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

    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 编辑器)。

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

    这三个是扩展对象属性的良好、可靠和透明的方法。通过使用你的的方法,你可以很容易地以一堆乱七八糟的方式结束,如果这甚至适用于 UE 构建系统)。

    【讨论】:

    • 感谢帕维尔提供相关信息。让我解释一下:使用宏包含变量似乎是一种非常常见的方法。一位非常有经验的程序员告诉我这样做。不过,在虚幻中这可能是错误的。我们认为 UPROPERTY 宏可能在使用 PROPERTIES 宏之前被 Unreal Header Tool 修改了。这就是为什么我们认为 UHT 可能会破坏 PROPERTIES 宏的代码。我不知道我可以使用“UCLASS”来包含这些属性。我开始改用结构,因为我把它放在一个已经存在的类中,作为补充。我去测试一下
    • @darkgaze 您需要指定UCLASSUSTRUCT 以便UHT 可以找到classstruct。然后你需要正确使用UPROPERTY (answers.unrealengine.com/questions/89949/…) 同样的机制适用于UFUNCTION(例如如果你想使用C++引入的委托,你可以添加仅使用UFUNCTION()(待续)
    • @darkgaze(继续)(见forums.unrealengine.com/community/…)。但是如果你想从Blueprint中调用某个函数,你需要将它标记为UFUNCTION(BlueprintCallable, Category = "MyCategory")。一旦你熟悉了这个概念,你就可以很容易地扩展你的代码并将新的东西暴露给蓝图。
    • 谢谢帕维尔。我们不使用蓝图。我们的功能非常低级,我们现在不喜欢视觉表示。顺便说一句,与告诉我这样做的人核实过。他说你的想法要好得多,虽然宏的东西很常见,但不如结构/类解决方案干净。 :-)
    • 不客气。而且我很高兴听到一位经验丰富的人的称赞,因为我自学了游戏编程,而且我知道有很多我不知道的好东西和游戏开发实践。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多