Как я писал систему сохранений для Unreal Engine.

Даже симпотичную обложку сделал для поста, чтоб вам приятно было.
Даже симпотичную обложку сделал для поста, чтоб вам приятно было.

Я уже как-то делал сохранения, сохранял данные своей прошлой игре, там мне надо было хранить настройки пользователя, немного, но все же. Собственно задачи сохранять огромные и разнообразные данные не возникало, я не задумывался над этим.

За это время не смотря на все трудности со здоровьем и финансами, мне удалось придумать, спроектировать и реализовать реально мощную и удобную систему. Сначала я отработал простые приемы Сделал. Загрузил. Работает! Ну, я и обрадовался. Потом добавил в игру дверь. Сохранился, когда она была открыта. Загрузился — а она снова на замке. «Ага, — сообразил я, — значит, нужно запоминать не только позицию, но и состояние предметов». И понеслась...

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

Как говорится "Если бы мы знали, что это такое, но ма не знаем, что это такое".

А потом компа под рукой не было долгое время, много времени пришлось потратить играя в квест игру - "Жизнь", но я находил немножко времени и чтобы не тратить его впустую, я начал проводить исследования по теме, пересмотрел два десятка невнятных видео, из которых только два оказались более менее вменяемыми. И хоть и говорят, что Ютуб - кладезь информации, но по факту большая часть этой информации - мусор и вообще тратить свое время пытаясь научится работать на Ютубе - пустая трата времени. (Есть там хорошие ребята, которые вкратце суть объясняют но их единицы, и их знания тоже не всеобъемлющие)

Читайте официальную документацию и описание методов и примеров от создателей движка - инструкция это всегда важно. Хорошенько пошарил по документации, запылесосил весь интернет через нейронку на примеры успешной архитектуры, методов и подходов. Проанализировал недельный запас информаци и... И такой все... Я готов, дайте мне только комп. Сидел ночь проектировал расписывал, вторую ночь писал уже сам код на блюпринтах.

А я ещё я как дурак начал писать систему прям в большом проекте, все подтормаживает, непонятно, что неправильно работает сохранения или другая игровая логика.

Никогда не пишите и не проектируйте автономные системы в готовых проектах. Это тупиковая ветвь развития, независимые системы на то и независимые, что могут работать в сферическом вакууме.

Но настоящий ад начался, когда мне понадобились переходы между уровнями. Рассинхрон фактов и ожиданий, то что должно быть отсутствует, то чего не должно быть присутствует, а ещё бывало так, что уровни смешивались просто напросто.

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

Пошел на улицу покурил, посидел подумал. Думал я неделю попутно снова играя в квест "Жизнь", проходил задание, как найти лекарства за пол мульта, и пришел к простой но эффективной схеме. 1. Пусть каждый объект в игре сам отвечает за то, что ему сохранять. Он должен быть сохраняемым, но расширять свои потребности если захочет. 2. У каждого должен быть свой несменный паспорт (ID). Даже если объект создаётся прямо во время игры, поэтому пришлось написать простенький генератор ID, что на самом деле было самой простой задачей если честно. 3. Добавить проверки на физику, ведь как оказалось не ко всем объектам можно применять данные напрямую. 4. Тут, как-то подумалось про крещение, и я понял как восстанавливать мир таким какой он был на момент сохранения. Аллилуйя. И вот тут-то всё и сложилось. Родилась идея с двумя простыми кирпичиками: интерфейс и компонент Теперь всё работает так: добавляешь объекту компонент — и он автоматически получает свой уникальный ID. Если этот объект ещё и реализует специальный интерфейс — он сам говорит, какие его данные нужно записать, и сам же знает, как их потом прочитать. Никаких монструозных структур, никакого страха «ой, я тут новое поле добавил, а в сохранениях о нём забыл». Но главный прорыв случился в логике перехода между уровнями. Я перестал пытаться восстановить все сразу, накинул валидацию по уровню и очистку на каждом цикле сохранения и загрузки. И оно заработало! По-настоящему. Игрок появляется именно там, где его оставил. Ящики стоят на своих местах. Двери помнят, открыты они или закрыты. Физические предметы катятся/летят туда куда и должны. Теперь моя система сохранений работает как швейцарские часы — тихо, надёжно, и её можно легко расширять. Захотел добавить в игру сундук с инвентарём? Просто наделяешь его тем самым интерфейсом — и он уже умеет сохраняться. Нужно автосохранение? Без проблем. Хочешь десять слотов? Пожалуйста. Вспомнил рекламу ЮПИ из детства - "Просто добавь воды!" Вот так, через сплошное разочарование, жопаболь и три переписанных с нуля системы, родилось решение, которым я наконец-то могу гордиться

В это раз даже без ссылок на другие свои ресурсы.

Спасибо, что прочитали.

6
1
1
1
5 комментариев