我有一个类,用属性描述一些对象,例如库存项目。
与默认构造函数一起,我需要参数化的构造函数,以使用某些参数集(例如size)创建项目
UCLASS()
class xxx_API UItem : public UObject
{
GENERATED_BODY()
public:
UItem();
~UItem();
UItem(int _size);
UPROPERTY(BlueprintReadOnly, Category = "Parameters")
int size = 0;
};
我还有另一个类,我想用作预定义项目的容器,因此我可以从游戏的其他位置引用它。
UCLASS()
class xxxx_API UItemsContainer : public UObject
{
GENERATED_BODY()
public:
UItemsContainer();
~UItemsContainer();
UItem SomeItem = UItem(100);
};
所以我可以在游戏开始时创建这个物品容器
ItemsContainer = NewObject<UItemsContainer>();
然后将其添加到这样的某些实体的项目集合中
TArray<UItem*> CharacterItems = {};
CharacterItems.Add(&ItemsContainer.SomeItem);
由于项目是固定的,并且在游戏过程中不会更改,因此我不想为每个项目创建特定的对象,而只引用容器条目。
虽然在编译时出现错误,但是我尝试访问UItem类的私有成员。虽然,它的构造函数是公共的,所有属性都是公共的。我认为UClass中有些东西不允许我那样使用构造函数,因为我可以用不是UObject的对象来做到这一点。但是我需要它成为UObject,才能在蓝图中使用。而且我不知道如何以其他方式调用非默认构造函数。
可能我可以使用NewObject创建默认对象,然后对其进行初始化并存储在数组中,但是看起来会有太多的代码和复杂性。
有什么建议吗?
最佳答案
因为C ++已在Unreal中进行了样式化,例如自动生成的UItem
源文件在目录中:
MyProj\Intermediate\Build\Win64\UE4Editor\Inc\MyProj\Item.generated.h
您可以打开此源,
UItem
的副本构造函数已被遮盖,并且UItem SomeItem = UItem();
将触发copy-constructor,因此您将收到尝试访问UItem类的私有成员的编译错误。在Unreal中,您必须在创建UObject时调用
NewObject
,例如SomeItemPtr = NewObject<UItem>(Outer);
如果要在创建UObject时传递参数,则可以定义一个特定的函数
void UItem::SetParams(int Size)
{
//initiation ...
}
例如
UItemsContainer::AddItem(int ItemSize)
{
SomeItemPtr = NewObject<UItem>(this);
SomeItemPtr->SetParams(ItemSize);
}
关于c++ - 使用构造函数从另一个类创建UObject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58235175/