如何在c++;宏 >我想使用C++宏创建的项目: #define PROPERTIES\ UPROPERTY(blabla)\ variableType varName;\ UPROPERTY(blabla)\ variableType2 varName2; 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;

如何在c++;宏 >我想使用C++宏创建的项目: #define PROPERTIES\ UPROPERTY(blabla)\ variableType varName;\ UPROPERTY(blabla)\ variableType2 varName2; 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;,c++,properties,macros,unreal-engine4,C++,Properties,Macros,Unreal Engine4,因此,我可以将属性添加到其他文件中,包括此文件,并对其使用properties宏 class XYZ... { ... public: PROPERTIES ... UPROPERTY() varibleType3 name3; .... } 此设计来自一个典型的组织,其中这些参数来自另一个类,因为它们与该类相关 因此,我可以包含不同的文件,并包含要在编辑器中显示的所有属性 发生的事情是,不真实的标题工具完全忽略了Upperty

因此,我可以将属性添加到其他文件中,包括此文件,并对其使用properties宏

class XYZ...
{

...

public:
      PROPERTIES

      ...
      UPROPERTY()
      varibleType3 name3;
      ....
}
此设计来自一个典型的组织,其中这些参数来自另一个类,因为它们与该类相关

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

发生的事情是,不真实的标题工具完全忽略了Upperty,当然,可能是因为它在宏之前被处理,然后被宏。。。令人惊讶的是,这是有效的,但只有变量,而不是连根拔起。。。所以编辑没有显示它


有什么想法吗?

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

我还想指出,这种设计真的很糟糕,我想你可能会有问题。正如您正确指出的,Epic具有自定义反射系统(UHT),它允许您使用GC等自动内存管理。更多关于构建系统的信息

我认为你应该决定如何使用这些财产。由于要将它们分布到多个参与者上,因此可以从以下选项中进行选择:

  • 继承权
  • 对象引用
  • 组件系统
  • 第一个是非常琐碎的,我相信你熟悉这个概念。我认为你有你选择宏观解决方案的理由注意不允许使用多重继承(在经典C++中是可能的),这是由于UBT

    第二个是这样的:

    #define PROPERTIES\
    UPROPERTY(blabla)\
    variableType varName;\
    UPROPERTY(blabla)\
    variableType2 varName2;
    
    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编辑器)

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


    这三种方法都是扩展对象属性的良好、可靠和透明的方法。通过使用宏的方法,您可能会很容易地陷入堆积如山的混乱,如果这甚至可以与UE构建系统一起工作的话

    谢谢你的相关信息,帕维尔。让我解释一下:使用宏包含变量似乎是一种非常常见的方法。一位经验丰富的程序员告诉我这样做。不过,这在《虚幻》中可能是错误的。我们认为可能在使用PROPERTIES宏之前,Unreal Header工具修改了Upperty宏。这就是为什么我们认为UHT可能破坏了属性宏的代码。我不知道我可以使用“UCLASS”来包含属性。我开始使用struct,因为我把它放在一个已经存在的类中,作为一个补充。我来测试一下it@darkgaze您需要指定
    UCLASS
    USTRUCT
    ,以便UHT可以找到
    class
    struct
    。你需要正确的使用<代码> UTrime<代码> >()同样的MeChanistic也适用于<代码> uStult<代码>(如果你想使用C++引入的委托,你可以只添加代码<代码UnType())/CUT>(继续)@暗视(继续)(参见)。但是,如果您想从Blueprint调用某个函数,则需要像
    uffunction(BlueprintCallable,Category=“MyCategory”)那样对其进行标记
    。一旦你熟悉了这个概念,扩展你的代码并向蓝图展示新事物将变得非常简单。谢谢Pavel。我们不使用蓝图。我们的功能非常低,现在我们不喜欢视觉表现。顺便说一句,与告诉我这样做的人进行了核实。他说你的想法好得多,没有虽然宏的东西很常见,但它不像结构/类解决方案那样干净。:-)欢迎您。我很高兴听到一个有经验的家伙的称赞,因为我自己都学会了游戏编程,我知道有很多好东西和游戏开发实践我都不知道。