Использование stl-контейнеров с Unreal

Могу ли я использовать std::vector, std::unordered_map вместо TMap, TVector... и т. Д.?

Мне нужен класс для сериализации всей его информации, и у меня есть код, который уже работает с stl.

Я тестировал попытки использовать UPROPERTY на них, и это невозможно,(Есть ли способ сделать это?). Но я в порядке с этим.

Что мне нужно знать, так это то, что происходит при сериализации всего класса, когда некоторые его члены являются контейнерами stl.

1 ответ

Решение

Вы не должны использовать их.

Вы не должны использовать стандартную библиотеку C++ для других, чем для связи с внешними библиотеками, и если вы используете их, вы должны избегать использования UFUNCTION и UPROPERTY на них. https://answers.unrealengine.com/questions/180421/how-to-use-c-standard-library-std.html

Если вам нужно сериализовать свойства, я хотел бы предложить использовать систему Рамы ( UE Wiki). Я использовал его в своей игре для сохранения / загрузки данных в двоичные файлы, но его можно было легко расширить для отправки данных по сети.

По сути, в этой системе вы перегружаете << оператор. Плюс в том, что вы определяете всю структуру в одном месте, и одна функция может использоваться как для сохранения, так и для загрузки. Обратите внимание, что я столкнулся с проблемами компиляции, когда я пытался скомпилировать код, например:

TArray<UObject> array = // init

// ar is container to serialization
ar << array;

Но я решил это путем сопоставления UObject с UStruct так код, как

TArray<FStruct> array = // init

// as is container to serialization
ar << array;     // now, this will compile

Это было в UE 4.15, и, возможно, это было решено в более поздних версиях.

Если вы хотите больше узнать о моей реализации системной системы Rama, вы можете взглянуть на мой репозиторий моей игры TCF2 (GitHub). Вы ищете /Source/GameSave/[Public|Private]/SaveGameCarrier - это мой основной класс для экономии. Пример помощника по отображению можно найти в /Source/Inventory/Public/InventoryHelpers.h

Другие вопросы по тегам