gpt4 book ai didi

c++ - 使用构造函数从另一个类创建 UObject

转载 作者:行者123 更新时间:2023-11-28 01:17:22 27 4
gpt4 key购买 nike

我有一个类,描述了一些具有属性的对象,例如库存项目。除了默认构造函数,我还需要参数化构造函数,以创建具有特定参数集的项目,例如,大小)

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 类的私有(private)成员。但是,它的构造函数是公共(public)的,所有属性都是公共(public)的。我认为 UClass 中有些东西不允许我以这种方式使用构造函数,因为我可以使用不是 UObject 的对象来执行此操作。但我需要它是 UObject,才能在蓝图中使用。而且我不知道如何以其他方式调用非默认构造函数。也许我可以用 NewObject 创建默认对象,然后将其初始化并存储在数组中,但看起来代码太多且复杂。有什么建议吗?

最佳答案

因为 C++ 在 Unreal 中已经被风格化了,例如UItem 自动生成的源文件在目录中:

MyProj\Intermediate\Build\Win64\UE4Editor\Inc\MyProj\Item.generated.h

你可以打开这个源码,UItem的copy-constructor已经被shadow了,UItem SomeItem = UItem();会触发copy-constructor,所以你会尝试访问 UItem 类的私有(private)成员时出现编译错误。

enter image description here

在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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com