Som*_*ber 0 c++ oop constructor object unreal-engine4
我有一个类,描述一些具有属性的对象,例如库存项目。与默认构造函数一起,我需要参数化构造函数,以创建具有某些参数集的项目,例如大小)
UCLASS()
class xxx_API UItem : public UObject
{
GENERATED_BODY()
public:
UItem();
~UItem();
UItem(int _size);
UPROPERTY(BlueprintReadOnly, Category = "Parameters")
int size = 0;
};
Run Code Online (Sandbox Code Playgroud)
我还有另一个类,我想将它用作预定义项目的容器,这样我就可以从游戏的其他地方引用它。
UCLASS()
class xxxx_API UItemsContainer : public UObject
{
GENERATED_BODY()
public:
UItemsContainer();
~UItemsContainer();
UItem SomeItem = UItem(100);
};
Run Code Online (Sandbox Code Playgroud)
所以我可以在游戏开始时创建这个项目容器
ItemsContainer = NewObject<UItemsContainer>();
Run Code Online (Sandbox Code Playgroud)
然后将它添加到某个实体的某个项目集合中
TArray<UItem*> CharacterItems = {};
CharacterItems.Add(&ItemsContainer.SomeItem);
Run Code Online (Sandbox Code Playgroud)
由于项目是固定的并且在游戏过程中不会改变,我不想为每个项目创建特定的对象,而只是引用容器条目。
尽管在编译时出现错误,但我尝试访问 UItem 类的私有成员。虽然,它的构造函数是公共的,并且所有属性都是公共的。我认为 UClass 中有一些东西不允许我以这种方式使用构造函数,因为我可以对不是 UObject 的对象执行此操作。但我需要它是 UObject,才能在蓝图中使用。而且我不知道如何以其他方式调用非默认构造函数。也许我可以用NewObject创建默认对象,然后初始化它并存储在数组中,但看起来代码和复杂性太多。请问有什么建议吗?
小智 6
因为 C++ 已经在 Unreal 中进行了风格化,例如自动生成的源文件UItem在目录中:
MyProj\Intermediate\Build\Win64\UE4Editor\Inc\MyProj\Item.generated.h
Run Code Online (Sandbox Code Playgroud)
你可以打开这个源码,它的copy-constructorUItem已经被隐藏了,UItem SomeItem = UItem();会触发copy-constructor,所以你会得到一个编译错误,试图访问UIItem类的私有成员。
在 Unreal 中,你必须NewObject在创建 UObject 时调用,例如
SomeItemPtr = NewObject<UItem>(Outer);
Run Code Online (Sandbox Code Playgroud)
如果你想在创建 UObject 时传递参数,你可以定义一个特定的函数
void UItem::SetParams(int Size)
{
//initiation ...
}
Run Code Online (Sandbox Code Playgroud)
例如
UItemsContainer::AddItem(int ItemSize)
{
SomeItemPtr = NewObject<UItem>(this);
SomeItemPtr->SetParams(ItemSize);
}
Run Code Online (Sandbox Code Playgroud)