Использование 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