#c #serialization #migration #deprecated #unreal-engine4
Вопрос:
Я работаю над переносом игры нашего клиента с unreal engine 4.19 на 4.26, и единственная проблема, с которой я сталкиваюсь, — это сериализация их системы сохранения. Вот как они сериализуют свойства (что приводит к ошибкам компиляции):
FProperty** PropertyPtr = SaveGameProperties ? SaveGameProperties->Find(PropertyName) : nullptr;
FProperty* Property = PropertyPtr ? *PropertyPtr : nullptr;
if( Property )
{
uint8* PropertyAddr = Property->ContainerPtrToValuePtr<uint8>(amp;Object);
Property->SerializeItem(Ar, PropertyAddr);
}
else
{
ensure(false);
Ar.Seek(SkipOffset);
}
Строка, которая выдает мне ошибку компиляции, такова Property->SerializeItem(Ar, PropertyAddr);
. Ar
это FArchiveamp;
кстати. В 4.26 для этой функции требуется FSlot
, которая является частью FStructuredArchive
из того, что я видел. Я хотел бы знать, есть ли функция, которая выполняет то же самое, но имеет другое имя или была перемещена в другой класс/пространство имен, потому что переписывание всей сериализации файлов сохранения не было бы идеальным решением этой проблемы для меня, поскольку функциональность их расширенной системы сохранения огромна. Я попытался заглянуть в примечания к выпуску движка, но не смог найти никакой информации об этом изменении, и проверка больших двоичных объектов (4.19->4.21 (где было внесено изменение)) не дала никакого представления, так как не было UE_DEPRECATED()
макрос или что-то подобное, которое подсказывало бы изменить систему вручную (просмотр тысяч коммитов, чтобы узнать, когда именно было внесено это изменение, также не идеален), и я тоже ничего не смог найти на форумах. Банкомат я использую Property->Serialize(Ar))
только для компиляции кода (есть еще много других ошибок, которые мне все еще нужно исправить, клиент также изменил движок и многое другое), но я не уверен, что это правильное решение проблемы, так SerializeItem(...)
как оно прокомментировано как часть FProperty
интерфейса, тогда Serialize(...)
как является частью UObject
интерфейс, и я не знаю, как именно реализации этих функций менялись на протяжении многих лет во всех детских классах.
TLDR: Есть ли способ заменить этот вызов функции функционально аналогичным, который позволяет мне FProperty
сериализоваться FArchive
так же, как SerializeItem(...)
в 4.19? Спасибо!
UPD: Извините за путаницу с ошибками компиляции. Я имел в виду, что SerializeItem(...)
с подписью, которая включает FArchive
в себя, не существует, что означает, что я должен использовать что-то другое.
Комментарии:
1. » которые дают мне ошибки компиляции » — Включите эти ошибки в вопрос. Если это много, то 20-30 первых строк может быть достаточно.
2. Эй, да, извините, я должен был быть более конкретным с этим, я думаю, в основном ошибка компиляции заключается в том, что функция с этой подписью не существует, а это значит, что я должен найти ей альтернативу.
3. UE 4.27 содержит это исправление » Исправлена проблема в методе SerializeItem ArrayProperty при использовании определяемого пользователем форматирования структурированного архива, вызванная несоответствием между сохранением и загрузкой ветвей при выполнении неверсионной сериализации свойств. «- Может ли это быть связано с проблемой, с которой вы столкнулись в 4.26?
4. @TedLyngmo, к сожалению, нет, это уже используется
FStructuredArchive::FSlot
для этой функции. Моя проблема заключается в том, что они изменили сигнатуру функции использоватьFArray
, чтобыFSlot
и я не знаю, лучший способ изменить эту функцию без необходимости переписывать весь сэкономить системы, поскольку это займет слишком много времени и Sony не понравится, если старый savefiles не будут совместимы с новой версией игры (оно имеет для PS4 версии, как хорошо, что мы должны обновить).