Всем привет. Ковыряю потихоньку свою игру в жанре менеджер, и предо мной наконец встал очевидный вопрос: "как лучше хранить данные?".
При первом рассмотрении вопроса, самое простое решение, которое я смог найти в интернете - хранить данные в JSon файле. Но насколько я смог понять, это требует написание (переписывания) большого количества кода, чтобы была возможность конвертации данных в json файл с последующей возможностью извлекать их обратно.
Как я понял JSon работает по схеме "ключ: значение", но значения могут быть только следующих типов "строка, число, объект JSON, массив, boolean".
Вот у меня есть класс Warrior. Я создаю экземпляр этого класса, заполняю его данными и добавляю экземпляр в List<Warrior> PlayerOrder. Есть возможность хранить все данные всех сохраненных экземпляров Warrior из List<Warrior>PlayerOrder одном файле?
public class Warrior
{
    // Общая информация \\
    public int id; //Id персонажа
    public string first_name; //Имя
    public string surname; //Фамилия
    public string title; //Титул(звание в игре)
    public string nick; //Имя данное игроком
    public int age; //Возраст
    public int height; //Рост - см
    public int weight; //Вес - кг
    public string hand; //рабочая рука
    public string weapon; //любимое оружие

    //Временные параметры\\
    public bool life; //Статус: жив/мертв
    public bool orden; //Статус: нанят/нет
    public int mood; //настроение от 0 до 5
    public int skills; //Сумма всех характеристик (новая)
    public int skills_old; //Сумма всех характеристик (старая)
    public int potential; //Потенциал
    public int hp; //Здоровье
    public int fitness; //Физическое состояние
    public int salary; //Зарплата

    //Развитие тела\\
    public int strong;
    public int agility;
    public int coordination;
    public int speed;
    public int jumping;
    public int beauty;
    public int perception; //Восприятие
    public int stamina; //Выносливость - влияет на усталость и живучесть
    public int durability; //Стойкость - сопротивление урону
    public int reflex; //Рефлекс - бонусный параметр
    public int traumatism; //Склонность к травмам

    //Ментальные способности\\
    public int intelligence;
    public int intuition; //Интуиция
    public int composure; //Хладнокровие
    public int oratory; //Красноречие
    public int luck;
    public int leadership; //Лидерство
    public int aggression;
    public int compliance; //Податливость
    public int greediness; //Ненасытность (жадность)
    public int loyalty; //Верность
    public int ambition; //Амбициозность
    public int lustfulness; //Похотливость
    public int courage; //Смелость
    public int caution; //Осторожность
    public int faith; //Вера

    //Профессиональность\\
    public int trade;
    public int politics;
    public int world; //Знание о мире
    public int engineering;
    public int fame; //Известность в мире
    public int management; //Управление
    public int intrigue; //Интриги
    public int science;
    public int finance; //Финансы
    public int contact; //Связи
    public int medicine; //Медицина

    //Боевые навыки\\
    public int melee; //Оружие ближнего боя
    public int ranged; //Оружие дальнего боя
    public int shield; //Щиты
    public int invisibility; //Скрытность
    public int tactics; //Тактика боя
    public int technique; //Техника боя
    public int orientation; //Ориентация на местности
    public int dodge; //Уклонение
}
Также прилагаю примерную схему (чтобы были понятны масштабы) взаимодействия данных в моей игре.
Прошу советов

Принятый ответ

На хгм даже была статья: xgm.guru/p/unity/serialization-unity
Можно что-то с интернета посмотреть: prasetion.medium.com/saving-data-as-json-in-unity-4419042d1334
но значения могут быть только следующих типов "строка, число, объект JSON, массив, boolean".
Этого достаточно, чтобы воссоздать геймстейт. Не нужно пытаться засунуть геймобжект, просто сохрани какой-нибудь айди, положение, там скейл и при загрузке закинь
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
22
2 года назад
1
На хгм даже была статья: xgm.guru/p/unity/serialization-unity
Можно что-то с интернета посмотреть: prasetion.medium.com/saving-data-as-json-in-unity-4419042d1334
но значения могут быть только следующих типов "строка, число, объект JSON, массив, boolean".
Этого достаточно, чтобы воссоздать геймстейт. Не нужно пытаться засунуть геймобжект, просто сохрани какой-нибудь айди, положение, там скейл и при загрузке закинь
Принятый ответ
0
13
2 года назад
0
Можно что-то с интернета посмотреть: prasetion.medium.com/saving-data-as-json-in-unity-4419042d1334
По итогу разобрался, но пришлось немного помучиться.
Загруженные файлы
1
37
2 года назад
1
Советую разбить на подклассы, чем хранить гиганты. Либо там трейты или примеси какие-то должны быть
0
17
2 года назад
0
В джсон и храни есть игра cdda там файл сохранения может весить 1гб и больше
0
37
2 года назад
0
В джсон и храни есть игра cdda там файл сохранения может весить 1гб и больше
Можно в zip потом закидывать, json хорошо сжимается
1
17
2 года назад
Отредактирован ledoed
1
Есть еще библеотека с помощью которой можно серилизовать переменные а не целый класс

В джсон и храни есть игра cdda там файл сохранения может весить 1гб и больше
Можно в zip потом закидывать, json хорошо сжимается
было бы прикольно но проблема возникнет при загрузке,придеться все сохранение кидать в оперу чем загружать по частятм
к сожелению ката так не может а серелизует все сохранение

кста еще поможет атрибут [SerializeField] если хош приватную переменную сохранить
Пример:
        [SerializeField]
        private int _intelligence;
        public int Intelligence 
        {
            get => _intelligence;
            set => _intelligence = value < 0 ? 0 : value > 10 ? 10 : value;
        }
в джсон можно еще целые обьекты сохранять а с библиотекой даже словари
Пример:
    [System.Serializable]
    public class SaveMeClass 
    {
        [SerializeField]
        private SaveStruct _saveStruct;

    }

    [System.Serializable]
    public struct SaveStruct
    {
        [SerializeField]
        private int saveint;
        [SerializeField]
        private string savestring;
    }
Этот комментарий удален
0
37
2 года назад
Отредактирован ScorpioT1000
0
ledoed, можно и по частям, если осторожно парсить например корень по чанкам доставать в строку и ее уже парсить. Ну типа руками делить массив объектов - (там всего 4 символа разных и пробелы) разделять, а объект сам скармливать каждый
0
13
2 года назад
0
Советую разбить на подклассы, чем хранить гиганты.
В джсон и храни есть игра cdda там файл сохранения может весить 1гб и больше
Я конечно полный профан в данных вопросах, но по моим грубым подсчетам:
1 экземпляр класса Warrior у меня получился примерно 2 кб, всего будет ~500 экземпляров на старте игры. Каждый игровой цикл будет прибавляться еще ~500 экземпляров, + будут выпиливаться экземпляры каждые 10 игровых циклов и каждую смерть Warrior. Ну т.е. на пике вес файла будет максимум
10 мб.
Я не собираюсь никакие бесконечно расширяющиеся карты мира генерировать. 😀
Короче, будем решать задачи по мере их поступления.
ScorpioT1000:
Либо там трейты или примеси какие-то должны быть
Полез гуглить что такое трейты в итоге зачем-то залипал час на статью "реализация множественного наследования в c#" D:
Чтобы оставить комментарий, пожалуйста, войдите на сайт.