UE4 | C++ | 理解UPROPERTY(instanced)
1. 背景
最近在阅读源码,其中有一段物理碰撞体的部分使用的是UPROPERTY(instanced)
,一开始读到这部分的时候比较困惑,我觉得如果只是想要对同一个类有不同的实例对象的话可以直接初始化不同的对象啊,并不需要单独设置一个标签。
下面我来举例说明一下instanced
标签的作用。
2. 举例说明
我来举个例子说明一下instanced
和 实例化 这两个概念。
观察下面两个类型的变量,一个是UTexture2D
,另一个是UStaticMeshComponent
:
UPROPERTY( Category=Test, EditDefaultsOnly )
UTexture2D* TestAsset;
UPROPERTY( Category=Test, EditDefaultsOnly )
UStaticMeshComponent* TestComponent;
具有这两个属性的Actor
,这两个子对象的UPROPERTY
部分完全相同,但实际使用的时候我们却希望他们有不同的表现:
- 对于纹理
UTexture2D
这样的资源文件,如果咱们有10个不同的actor使用相同的纹理,则咱们肯定不希望有10个完全一样的相同纹理的副本(Ctr+C,Ctr+V十遍确实不太好 XD ) 。 - 而对于
UStaticMeshComponent
,咱们又确实希望相同的10个Actor都能拥有属于他们各自的组件副本。
前者未实例化,而后者则是实例化。
3. 实例化与非实例化
如上所述,实例化就是咱们希望某种类型的所有属性都相同的一种行为。
为此,UE4提供了两种标签
DefaultToInstanced
用来使得这一种类型的所有属性都有着相同的行为。instanced
属性关键字用来 基于每个属性进行设置。
( 顺带说一句,将instanced
用于UClass属性并没有什么用。 相同的UClass的不同实例不会产生不同的结果,而所有这些新构造的对象都将使用相同的CDO来初始化其属性。)