我有一个类,用属性描述一些对象,例如库存项目。
与默认构造函数一起,我需要参数化的构造函数,以使用某些参数集(例如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类的私有成员的编译错误。

c&#43;&#43; - 使用构造函数从另一个类创建UObject-LMLPHP

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

10-11 19:39
查看更多