【问题标题】:Create UObject from another class with constructor使用构造函数从另一个类创建 UObject
【发布时间】:2020-02-02 17:16:40
【问题描述】:

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

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++ oop object constructor unreal-engine4


    【解决方案1】:

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

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

    你可以打开这个源码,UItem的copy-constructor已经被遮蔽了,UItem SomeItem = UItem();会触发copy-constructor,所以你会得到一个编译错误,试图访问UItem类的私有成员。

    在虚幻中,创建UObject时必须调用NewObject,例如

    SomeItemPtr = NewObject<UItem>(Outer);
    

    如果你想在创建UObject时传递参数,你可以定义一个特定的函数

    void UItem::SetParams(int Size)
    {
        //initiation ...
    }
    

    例如

    UItemsContainer::AddItem(int ItemSize)
    {
        SomeItemPtr = NewObject<UItem>(this);
        SomeItemPtr->SetParams(ItemSize);
    }
    

    【讨论】:

    • 感谢您的信息。认为弄乱自动生成的文件是个坏主意,所以会使用 NewObject。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2012-06-22
    • 2011-03-24
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多