2017-08-29 32 views
1

我想拥有的物品中添加UPROPERTY()宏用C++宏这样创建的:如何将C++宏

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

这样我就可以将属性添加到其他文件,包括这一点,并对其使用性能的宏。

class XYZ... 
{ 

... 

public: 
     PROPERTIES 

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

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

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

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

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

回答

1

你确定你的属性定义正确吗?您应该使用类似UPROPERTY(EditAnywhere, Category="My 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构建系统一起工作,那么您很容易就会陷入一团糟)。

+0

感谢您的相关信息,Pavel。让我解释一下:包含使用宏的变量看起来像是一种非常常见的方法。我被一位非常有经验的程序员告诉我这么做。不过在虚幻中可能是错误的。我们认为也许UPROPERTY宏被使用了BEFORE PROPERTIES宏的Unreal Header Tool修改。这就是为什么我们认为UHT打破了PROPERTIES宏的代码。 我不知道我可以使用“UCLASS”来包含属性。我开始使用一个结构,因为我把它放在一个已经存在的类中,作为补充。我会测试它 – darkgaze

+1

@darkgaze您需要指定'UCLASS'或'USTRUCT',以便可以通过UHT找到'class'或'struct'。然后,您需要正确使用'UPROPERTY'(https://answers.unrealengine.com/questions/89949/uproperty-not-reflecting-in-editor.html)。相同的机制适用于'UFUNCTION'(例如,如果你想要要使用C++引入的委托,只能添加使用'UFUNCTION()'(待续) –

+0

@darkgaze(继续)(请参阅https://forums.unrealengine.com/community/community-content-tools-and-tutorials/13915-教程创建和 - 使用 - 代表-C - 和 - 访问 - 它们合蓝图?30345-教程 - 创建和 - 使用-代表-C - 和 - 访问 - 它们合蓝图=) 。但是如果你想从* Blueprint *中调用一些函数,你需要将它标记为'UFUNCTION(BlueprintCallable,Category =“MyCategory”)'。一旦你熟悉了这个概念,那么扩展你的代码并向Blueprints公开新事物 –