Сохранение игры в файл в Unity

  Рет қаралды 15,350

Лавка Разработчика

Лавка Разработчика

3 жыл бұрын

Поддержи канал, бро!
paypal.me/gamedevlavka - мир
boosty.to/gamedevlavka - рф
И даже криптой (пока только Ethereum):
0x7a53325D1C36Eea7BbE8C6a8D00f2a0efd580e77
Как сделать сохранение игры в файл в Unity? Как сохранять Vector3 или Quaternion? Как сделать сохранение в файл на Android или iOS? Ответы на эти вопросы в новом видео из Лавки Разработчика!
Подписывайся на канал в телеге, или на твиттер, там я публикую коротенькие типсы и практики, которые помогут писать код лучше, понятнее и эффективнее:
Telegram: t.me/gamedevlavka
Twitter: / gamedevlavka
Twitter (личный): / vavilichevgd

Пікірлер: 49
@AlexandrGlumov
@AlexandrGlumov 2 жыл бұрын
Обалдеть! Спасибо ОГРОМНОЕ!
@GAMEDEVZONE
@GAMEDEVZONE 3 жыл бұрын
Я для себя сделал так: 1. Создал интерфейс IDataStorage, чтобы можно было в проектах менять реализацию без изменения основного кода 2. Сделал в нем Generic методы Get и Set с коллбеками (вдруг данные грузятся не моментально, например, по сети) 3. Создал необходимые реализации (PlayerPrefsDataStorage, JsonDiskDataStorage, BinaryDiskDataStorage) Итого: можно использовать в разных проектах, не трогая код хранилища. public interface IDataStorage { void Get(string key, Action onComplete, Action onError = null); void Set(string key, T value, Action onComplete = null, Action onError = null); void Delete(string key, Action onComplete = null, Action onError = null); void DeleteAll(Action onComplete = null, Action onError = null); }
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Я делал можно сказать точно так же, только еще дополнительно шифровал данные, ибо так можно легко изменить значения (взломать). Однако, во многих облачных системах данные хранятся в виде блока, и подгрузка микрочастями не подходит. Плюс, в случае работы с файлом/облаком, ты уменьшаешь количество команд на чтение и запись до минимума, а это хорошо, ведь чтение и особенно запись - дорогостоящие команды. В файл ты записываешь в определённых точках. И можно делать это в соседнем потоке (об этом не говорится в видео, но например у меня это делается в отдельном потоке).
@user-pc1bs1xy2q
@user-pc1bs1xy2q 2 жыл бұрын
Спасибо большое, все очень хорошо и понятно объяснено
@sergeykizin6101
@sergeykizin6101 Жыл бұрын
а это распространяется только на тот предмет на котором весит этот скрипт и он отвечает только за положение предмета? получается если в теории я сделал квест в своей игре и убежал куда то далеко и при последующем включении при нажатии кнопки всё что загрузится только позиция моего персонажа?
@gwynbleinn
@gwynbleinn 2 жыл бұрын
Извиняюсь за прямолинейность, но тема сохранений очень слабо и поверхностно раскрыта. Совсем новички в любом случае вряд ли смогут адаптировать эту систему под свои нужды, а более продвинутые и так смогут написать код самостоятельно, у них будет скорее проблема с общим пониманием как выстраивать архитектуру проекта и учитывать возможность сохранять данные о каких-то объектах при их создании. Допустим, есть персонаж с парой десятков характеристик, и у него есть инвентарь с десятком предметов, и на каждом предмете еще по 3 условных изменяющихся параметра. А таких персонажей несколько и мир в целом тоже хранит какие-то данные. Вот что мне с этим делать? Создавать для каждой структуры/класса суррогат? Или для класса не надо и они сохраняются целиком? Хотелось бы более реальный и углубленный пример реализации
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Вы правы, об этом стоит поговорить. Не в рамках этого видео, тут конкретная тема - сохранение в файл. А сохранение в целом - более широкая тема, но да, так же требует освещения, т.к. очень важна. Поставлю в план
@gwynbleinn
@gwynbleinn 2 жыл бұрын
@@gamedevlavka было бы очень круто глянуть. Об этом, к сожалению, почти не говорят
@whatsup325
@whatsup325 2 жыл бұрын
@@gamedevlavka Буду ждать этого видео!
@artko20
@artko20 2 жыл бұрын
@@gamedevlavka все новички ждём обобщённый видосик где будет больше примеров сохраняемых данных под разные случаи и условия. Кому-то это сейчас очень важно
@saurontheblack6566
@saurontheblack6566 Жыл бұрын
Главный вопрос не в том чтобы сохранить, а как сохранить так чтобы потом игра при обновлении в гугл плей не обнуляла сохранения особенно когда поля добавляются или убавляются
@Alex113mm
@Alex113mm 2 жыл бұрын
Урок клёвый. Но можно ли таким методом хранить List например. Если да то как?
@aleksey2793
@aleksey2793 8 ай бұрын
А какой облачный сервис для сохранений сейчас лучше использовать в России? Подойдет ли Unity cloud или Firebase? И планируются ли у вас видео по авторизации в облаке и облачным сейвам?
@user-cj2kg4vq3d
@user-cj2kg4vq3d 2 жыл бұрын
К сожалению по гайду напоролся на SerializationException: End of Stream encountered before parsing was completed. Ругается на функцию Load в Storage.
@gopasran4ik
@gopasran4ik 24 күн бұрын
Такая же фигня, как то решили этот вопрос
@victorreabco4771
@victorreabco4771 9 ай бұрын
а это будет работать для моб игр на андроид или IOS ???
@buran_m3248
@buran_m3248 9 ай бұрын
В классе суррогата (в моём случае, Vector2SerializationSurrogate), нужно явно указать типа интерфейса (System.Runtime.Serialization.ISerializationSurrogate), инче может возникнуть Compiler Error CS1503
@JavaSqr
@JavaSqr 4 ай бұрын
Не понял, куда это нужно пихать?
@kitgunaki3465
@kitgunaki3465 2 жыл бұрын
У меня тут ошибка при запуске.. Не понимаю в чем проблема NullReferenceException: Object reference not set to an instance of an object Storage.Load (System.Object saveDataByDefault) (at Assets/Scripts/Storage/Storage.cs:29)
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Ссылку потерял на объект в строке 29, написано в ошибке. Ищи ссылку))
@kitgunaki3465
@kitgunaki3465 2 жыл бұрын
@@gamedevlavka это я понял, но не нашел ссылку. Вроде перепроверил все
@kitgunaki3465
@kitgunaki3465 2 жыл бұрын
указывает на эту строку var savedData = _formatter.Deserialize(file); ошибка - Storage.Load (System.Object saveDataByDefault) (at Assets/Scripts/Storage/Storage.cs:29) и на эту _gameData = (GameData) _storage.Load(new GameData()); ошибка - Example.Load () (at Assets/Scripts/Storage/Example.cs:31)
@kitgunaki3465
@kitgunaki3465 2 жыл бұрын
возможно проблема в конструкторе, но хз где там
@legend6713
@legend6713 2 жыл бұрын
сделай видео как сделать созранение на кнопку на юнити игра на телефон
@igor_mutny
@igor_mutny 7 ай бұрын
Когда так страшно разбираться во всех этих форматтерах и сериализациях, и поэтому делаешь сохранения через FileStream...
@def6141
@def6141 3 жыл бұрын
Здорово! Но мне как полному новичку сложно понять как лучше это все реализовывать. В разных местах пишут, что надо все на скриптейблобджектах делать с интерфейсами, шифрованием.
@def6141
@def6141 3 жыл бұрын
И как собрать все данные в один блок для записи я тоже не ведаю :) или надо тут уже быть мало мальским кодером для понимания
@gamedevlavka
@gamedevlavka 3 жыл бұрын
ScriptableObject это не про сохранение, это про файлы конфигурации. Об этом есть видео на канале. А как лучше все реализовать - это уже решает программист, исходя из задач, есть только некоторые условные правила, которым лучше придерживаться :)
@gamedevlavka
@gamedevlavka 3 жыл бұрын
@@def6141 Однозначно, мало мальски понимать программирование нужно. Я рассказываю про приемы в программировании и тонкости в программировании под Unity, но не рассказываю о самом программировании, полагая, что эта база у подписчиков уже есть :)
@def6141
@def6141 3 жыл бұрын
Ушел на улерн.ми ботанить язык, скоро вернусь :D
@def6141
@def6141 3 жыл бұрын
Вот тут дядька сериализует в SO learn.unity.com/tutorial/creating-a-persistent-player-data-system?uv=2019.3&missionId=5f751af7edbc2a0022cdbbb6&pathwayId=5f7e17e1edbc2a5ec21a20af&contentId=6079d25cedbc2a001fae5e83&projectId=5d0f54f8edbc2a4dd39f1d6a#5d0f54d8edbc2a00212c2f30
@user-ye1wz9jx7u
@user-ye1wz9jx7u 2 жыл бұрын
Ты понял? -Да, что я не понял!
@dihaneeer
@dihaneeer 2 жыл бұрын
"Тип BinaryFormatter не является безопасным и не рекомендуется" любезно сообщает нам майкрософт в своей документации. И в отсутствии безопасности я убедился лично на следующем примере: - использовал класс контейнер для всех сохраняемых данных; - при десериализации приводил object к этому классу и ловил ошибку приведения типа, на случай обновления класса контейнера; - при разработке менял структуру класса контейнер, а в частности типы данных в полях класса; Через какое-то время у меня начало выдавать кучу ошибок при использовании десериализовынных данных, а точнее данных из класса контейнера. Я начал проверят, что же BinaryFormatter надесириализовал в мой контейнер и оказалось, что он без зазрения совести (ни одной ошибки) запихал мне в поля типа float[] совсем не те данные, а именно int просто int не массив даже. Исправить эту проблему не получилось, вот так я и пришел к документации майкрософт Скорее всего в момент десериализации не проверяется тип данных как следует, а просто происходит сравнивается размера типа и данные, которые туда помещаются и если размер данных не превышает, то данные помещаются в соответствующее поле, что само собой не может быть безопасным ни как
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Не знал, каюсь. Значит будет другой способ сериализации в ближайшем будущем
@dihaneeer
@dihaneeer 2 жыл бұрын
@@gamedevlavka майкрософт рекомендует json, и думаю это весьма годная альтернатива
@vtroe
@vtroe 3 ай бұрын
А как сериализовать List?
@_mirai
@_mirai 3 жыл бұрын
А я просто свои структуры создаю для типов, которые нельзя сериализавать =/ Типо VectorSerializable, ArraySerializable и тд
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Никто не запрещает :) у меня раньше так было, но с суррогаты сделали код приличнее, на мой взгляд
@spatiumcattus
@spatiumcattus 3 жыл бұрын
Класс, у меня так же на канале есть видео уроки!
@HelloWorld-ln5cy
@HelloWorld-ln5cy 2 жыл бұрын
Я читал в документации майнкрасоф, что бинарную сериализацию лучше не использовать, там нашлись уязвимости.
@Bushido_Cat
@Bushido_Cat 3 ай бұрын
Очень интересно, но ничего не понятно. Если бы я понимал что ты несешь, скорее всего я бы не смотрел твой ролик, а искал бы инфу про то как это все красиво завернуть.
@TheRomixERR
@TheRomixERR 2 жыл бұрын
Никуя не понял
@d1kay
@d1kay Жыл бұрын
я тоже😓
@SmartBasicPrograms
@SmartBasicPrograms 6 ай бұрын
Нудно, сложно и не понятно.
@JavaSqr
@JavaSqr 4 ай бұрын
Это уже твои траблы.
@huesos164
@huesos164 Жыл бұрын
дайте пж скрипты
Адаптивный UI в Unity. Часть 5. Настраиваем GridLayoutGroup
14:24
Лавка Разработчика
Рет қаралды 4,7 М.
How to make a Save & Load System in Unity | 2022
26:56
Shaped by Rain Studios
Рет қаралды 172 М.
Когда на улице Маябрь 😈 #марьяна #шортс
00:17
Can You Draw The PERFECT Circle?
00:57
Stokes Twins
Рет қаралды 96 МЛН
Тяжелые будни жены
00:46
К-Media
Рет қаралды 5 МЛН
Dynamic #gadgets for math genius! #maths
00:29
FLIP FLOP Hacks
Рет қаралды 18 МЛН
Организация проекта в Unity. Иерархия папок
11:36
Лавка Разработчика
Рет қаралды 8 М.
Top 10 Game Development Tools For 2024
16:06
Thomas Brush
Рет қаралды 102 М.
Как сделать сохранение в unity?
29:41
Максим Крюков
Рет қаралды 12 М.
20 Advanced Coding Tips For Big Unity Projects
22:23
Tesseract
Рет қаралды 151 М.
Protocol Buffers Crash Course
36:07
Hussein Nasser
Рет қаралды 232 М.
Unity Save Game System Tutorial | Save Data To JSON
43:53
Dan Pos
Рет қаралды 12 М.
Pathfinding - Understanding A* (A star)
12:52
Tarodev
Рет қаралды 112 М.
Когда на улице Маябрь 😈 #марьяна #шортс
00:17