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

แชร์
ฝัง
  • เผยแพร่เมื่อ 19 ธ.ค. 2024

ความคิดเห็น • 46

  • @GAMEDEVZONE
    @GAMEDEVZONE 3 ปีที่แล้ว +10

    Я для себя сделал так:
    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 ปีที่แล้ว +5

      Я делал можно сказать точно так же, только еще дополнительно шифровал данные, ибо так можно легко изменить значения (взломать).
      Однако, во многих облачных системах данные хранятся в виде блока, и подгрузка микрочастями не подходит.
      Плюс, в случае работы с файлом/облаком, ты уменьшаешь количество команд на чтение и запись до минимума, а это хорошо, ведь чтение и особенно запись - дорогостоящие команды. В файл ты записываешь в определённых точках. И можно делать это в соседнем потоке (об этом не говорится в видео, но например у меня это делается в отдельном потоке).

  • @aleksey2793
    @aleksey2793 ปีที่แล้ว +1

    А какой облачный сервис для сохранений сейчас лучше использовать в России? Подойдет ли Unity cloud или Firebase? И планируются ли у вас видео по авторизации в облаке и облачным сейвам?

  • @buran_m3248
    @buran_m3248 ปีที่แล้ว +1

    В классе суррогата (в моём случае, Vector2SerializationSurrogate), нужно явно указать типа интерфейса (System.Runtime.Serialization.ISerializationSurrogate), инче может возникнуть Compiler Error CS1503

    • @JavaSqr
      @JavaSqr 11 หลายเดือนก่อน

      Не понял, куда это нужно пихать?

  • @AlexandrGlumov
    @AlexandrGlumov 2 ปีที่แล้ว +4

    Обалдеть! Спасибо ОГРОМНОЕ!

  • @Какиграть-д6ю
    @Какиграть-д6ю 3 ปีที่แล้ว +4

    Спасибо большое, все очень хорошо и понятно объяснено

  • @РоманДжужа
    @РоманДжужа 3 ปีที่แล้ว +5

    К сожалению по гайду напоролся на SerializationException: End of Stream encountered before parsing was completed. Ругается на функцию Load в Storage.

    • @gopasran4ik
      @gopasran4ik 7 หลายเดือนก่อน

      Такая же фигня, как то решили этот вопрос

  • @saurontheblack6566
    @saurontheblack6566 ปีที่แล้ว +2

    Главный вопрос не в том чтобы сохранить, а как сохранить так чтобы потом игра при обновлении в гугл плей не обнуляла сохранения особенно когда поля добавляются или убавляются

  • @андрейсавушкин-у2р
    @андрейсавушкин-у2р 3 ปีที่แล้ว +1

    Ты понял?
    -Да, что я не понял!

  • @gwynbleinn
    @gwynbleinn 3 ปีที่แล้ว +16

    Извиняюсь за прямолинейность, но тема сохранений очень слабо и поверхностно раскрыта. Совсем новички в любом случае вряд ли смогут адаптировать эту систему под свои нужды, а более продвинутые и так смогут написать код самостоятельно, у них будет скорее проблема с общим пониманием как выстраивать архитектуру проекта и учитывать возможность сохранять данные о каких-то объектах при их создании. Допустим, есть персонаж с парой десятков характеристик, и у него есть инвентарь с десятком предметов, и на каждом предмете еще по 3 условных изменяющихся параметра. А таких персонажей несколько и мир в целом тоже хранит какие-то данные. Вот что мне с этим делать? Создавать для каждой структуры/класса суррогат? Или для класса не надо и они сохраняются целиком?
    Хотелось бы более реальный и углубленный пример реализации

    • @gamedevlavka
      @gamedevlavka  3 ปีที่แล้ว +13

      Вы правы, об этом стоит поговорить. Не в рамках этого видео, тут конкретная тема - сохранение в файл. А сохранение в целом - более широкая тема, но да, так же требует освещения, т.к. очень важна. Поставлю в план

    • @gwynbleinn
      @gwynbleinn 3 ปีที่แล้ว +2

      @@gamedevlavka было бы очень круто глянуть. Об этом, к сожалению, почти не говорят

    • @whatsup325
      @whatsup325 3 ปีที่แล้ว +6

      @@gamedevlavka Буду ждать этого видео!

    • @artko20
      @artko20 3 ปีที่แล้ว +9

      @@gamedevlavka все новички ждём обобщённый видосик где будет больше примеров сохраняемых данных под разные случаи и условия. Кому-то это сейчас очень важно

  • @igor_mutny
    @igor_mutny ปีที่แล้ว

    Когда так страшно разбираться во всех этих форматтерах и сериализациях, и поэтому делаешь сохранения через FileStream...

  • @Alex113mm
    @Alex113mm 2 ปีที่แล้ว +1

    Урок клёвый. Но можно ли таким методом хранить List например.
    Если да то как?

  • @dihaneeer
    @dihaneeer 3 ปีที่แล้ว +2

    "Тип BinaryFormatter не является безопасным и не рекомендуется" любезно сообщает нам майкрософт в своей документации.
    И в отсутствии безопасности я убедился лично на следующем примере:
    - использовал класс контейнер для всех сохраняемых данных;
    - при десериализации приводил object к этому классу и ловил ошибку приведения типа, на случай обновления класса контейнера;
    - при разработке менял структуру класса контейнер, а в частности типы данных в полях класса;
    Через какое-то время у меня начало выдавать кучу ошибок при использовании десериализовынных данных, а точнее данных из класса контейнера.
    Я начал проверят, что же BinaryFormatter надесириализовал в мой контейнер и оказалось, что он без зазрения совести (ни одной ошибки) запихал мне в поля типа float[] совсем не те данные, а именно int просто int не массив даже. Исправить эту проблему не получилось, вот так я и пришел к документации майкрософт
    Скорее всего в момент десериализации не проверяется тип данных как следует, а просто происходит сравнивается размера типа и данные, которые туда помещаются и если размер данных не превышает, то данные помещаются в соответствующее поле, что само собой не может быть безопасным ни как

    • @gamedevlavka
      @gamedevlavka  3 ปีที่แล้ว +1

      Не знал, каюсь. Значит будет другой способ сериализации в ближайшем будущем

    • @dihaneeer
      @dihaneeer 3 ปีที่แล้ว

      @@gamedevlavka майкрософт рекомендует json, и думаю это весьма годная альтернатива

  • @sergeykizin6101
    @sergeykizin6101 2 ปีที่แล้ว

    а это распространяется только на тот предмет на котором весит этот скрипт и он отвечает только за положение предмета?
    получается если в теории я сделал квест в своей игре и убежал куда то далеко и при последующем включении при нажатии кнопки всё что загрузится только позиция моего персонажа?

  • @ИнтерфейсаНет
    @ИнтерфейсаНет 9 หลายเดือนก่อน +1

    А как сериализовать List?

  • @def6141
    @def6141 3 ปีที่แล้ว +1

    Здорово!
    Но мне как полному новичку сложно понять как лучше это все реализовывать. В разных местах пишут, что надо все на скриптейблобджектах делать с интерфейсами, шифрованием.

    • @def6141
      @def6141 3 ปีที่แล้ว +1

      И как собрать все данные в один блок для записи я тоже не ведаю :) или надо тут уже быть мало мальским кодером для понимания

    • @gamedevlavka
      @gamedevlavka  3 ปีที่แล้ว

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

    • @gamedevlavka
      @gamedevlavka  3 ปีที่แล้ว

      @@def6141 Однозначно, мало мальски понимать программирование нужно. Я рассказываю про приемы в программировании и тонкости в программировании под Unity, но не рассказываю о самом программировании, полагая, что эта база у подписчиков уже есть :)

    • @def6141
      @def6141 3 ปีที่แล้ว +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

  • @victorreabco4771
    @victorreabco4771 ปีที่แล้ว

    а это будет работать для моб игр на андроид или IOS ???

  • @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 ปีที่แล้ว

      возможно проблема в конструкторе, но хз где там

  • @spatiumcattus
    @spatiumcattus 3 ปีที่แล้ว +1

    Класс, у меня так же на канале есть видео уроки!

  • @_mirai
    @_mirai 3 ปีที่แล้ว

    А я просто свои структуры создаю для типов, которые нельзя сериализавать =/
    Типо VectorSerializable, ArraySerializable и тд

    • @gamedevlavka
      @gamedevlavka  3 ปีที่แล้ว +3

      Никто не запрещает :) у меня раньше так было, но с суррогаты сделали код приличнее, на мой взгляд

  • @HelloWorld-ln5cy
    @HelloWorld-ln5cy 3 ปีที่แล้ว +1

    Я читал в документации майнкрасоф, что бинарную сериализацию лучше не использовать, там нашлись уязвимости.

  • @Bushido_Cat
    @Bushido_Cat 9 หลายเดือนก่อน

    Очень интересно, но ничего не понятно. Если бы я понимал что ты несешь, скорее всего я бы не смотрел твой ролик, а искал бы инфу про то как это все красиво завернуть.

  • @SmartBasicPrograms
    @SmartBasicPrograms ปีที่แล้ว

    Нудно, сложно и не понятно.

    • @JavaSqr
      @JavaSqr 11 หลายเดือนก่อน +1

      Это уже твои траблы.

  • @artem29005
    @artem29005 ปีที่แล้ว

    дайте пж скрипты