Создать UObject из другого класса с помощью конструктора - PullRequest
0 голосов
/ 04 октября 2019

У меня есть класс, описывающий некоторый объект со свойствами, например предмет инвентаря. И наряду с конструктором по умолчанию мне нужен параметризованный конструктор для создания элементов с определенным набором параметров, например, размером)

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, а затем инициализировать его и сохранить в массиве, но, похоже, будет слишком много кода и сложностей. Любые предложения, пожалуйста?

1 Ответ

2 голосов
/ 06 октября 2019

Поскольку C ++ стилизован под Unreal, например, автоматически сгенерированный исходный файл UItem находится в каталоге:

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

Вы можете открыть этот источник, конструктор копирования UItem былshadowed, и UItem SomeItem = UItem(); вызовет конструктор копирования, поэтому вы получите ошибку компиляции, которая попытается получить доступ к закрытым членам класса UItem.

enter image description here

В Unreal вы должны вызывать NewObject при создании UObject, например

SomeItemPtr = NewObject<UItem>(Outer);

Если вы хотите передать параметры при создании UObject, вы можете определить определенную функцию

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

например

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