Воскресенье, 24 Ноября 2024, 02:13

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как сделать сохранения
vova1227Дата: Вторник, 02 Марта 2021, 04:05 | Сообщение # 1
был не раз
Сейчас нет на сайте
Вопрос лично для меня еще сложный, прошу помощи.
1.Есть персонаж создающий объекты в сцене по средству Instantiate.
2. Приложение будет для мобильных устройств, насколько я понял там есть разница в методах сохранения, еще не очень понял в чем именно, но как бы в социализации. Хотя для начала мне хоть как то сохранить прогресс игры.
3. Документацию читал, но вывести из этого результат не видев ни одного примера мне сложно.
4. Я думаю что надо как то так:
-Создать динамический массив
-Собрать местоположение объектов которые созданы с момента чего то, или записывать сразу при их создании, или записывать все объекты которые в сцене при OnSceneExit, и вот тут тоже не придумал еще как именно потом отделить данные новых объектов от тех которые уже сохранены.
-Как то передать это в массив.
-Перевести массив в какой то вид сохранения.
-При загрузке игры в старт вписать функцию instantiate которая на основе координат из массива создаст объекты на тех же координатах.

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

Картинка с тестовой локации, что б было более понятно. Хотя бы как заспавненые кубик сохранять для начала.

https://ibb.co/xYQfX8c
Sanchez06Дата: Вторник, 02 Марта 2021, 21:20 | Сообщение # 2
участник
Сейчас нет на сайте
Цитата vova1227 ()
2. Приложение будет для мобильных устройств, насколько я понял там есть разница в методах сохранения, еще не очень понял в чем именно, но как бы в социализации. Хотя для начала мне хоть как то сохранить прогресс игры.

Как минимум, бинарная сериализация на андроид точно работает, скорее всего и на иос тоже.

Я сделал так -дикт, где ключ - название уровня, а значение - класс уровня. В уровне собственно листы противников, декораций и всего такого.
Код

[System.Serializable]
public Dictionary<string, Level> levels = new Dictionary<string, Level>();
public struct Corpse
{
    public string type;
    public int x;
    public int y;
}

[System.Serializable]
public struct Point
{
    public float X;
    public float Y;
    public float Z;
    public Point(float x, float y, float z)
    {
        X = x;
        Y = y;
        Z = z;
    }
}
[System.Serializable]
public struct Enemy
{
    public string type;
    public Point pos;
    public Point rot;
    public int hp;
    public AI_cult_1.State state;
    public int ammo;
    public bool vis;
}

[System.Serializable]
public struct Decoration
{
    public string type;
    public Point pos;
    public Point rot;
}

[System.Serializable]
public struct Level
{
    public List<Corpse> corpses;
    public List<Enemy> enemies;
    public List<Decoration> decorations;
}


После, добавляем в этот список новый уровень - тот, который мы хотим сохранить (для этого ессна надо находиться на нем же):
Код

Level lvl = new Level();

        lvl.decorations = GetAllDecor();//берем все декорации на сцене
        lvl.enemies = GetAllEnemies();//находим всех противников на сцене
        
        if (!levels.ContainsKey(SceneManager.GetActiveScene().name)) //если нет уровня в дикте
        {levels.Add(SceneManager.GetActiveScene().name,lvl);}        //то создадим его
        else
        {levels[SceneManager.GetActiveScene().name]=lvl;} //а если есть - перезапишем

    public List<Decoration> GetAllDecor()
    {
        List<Decoration> lol = new List<Decoration>();
        GameObject[] decors = GameObject.FindGameObjectsWithTag("Decoration");
        foreach (GameObject decor in decors)
        {
            Decoration a = new Decoration();
            a.type = decor.name;
            a.pos = new Point(decor.transform.position.x,decor.transform.position.y,decor.transform.position.z);
            a.rot = new Point(decor.transform.eulerAngles.x,decor.transform.eulerAngles.y,decor.transform.eulerAngles.z);
            lol.Add(a);
        }
        
        return lol;

    }

    public List<Enemy> GetAllEnemies()
    {
        List<Enemy> lol = new List<Enemy>();
        AI_cult_1[] enemies_on_scene = Object.FindObjectsOfType<AI_cult_1>();
        foreach (AI_cult_1 enemy in enemies_on_scene)
        {
            Enemy a = new Enemy();
            a.type = enemy.name;
            a.pos = new Point(enemy.transform.position.x,enemy.transform.position.y,enemy.transform.position.z);
            a.rot = new Point(enemy.transform.eulerAngles.x,enemy.transform.eulerAngles.y,enemy.transform.eulerAngles.z);
            a.ammo = enemy.countAmmo;
            a.hp = enemy.hp;
            a.state = enemy.state;
            a.vis = enemy.vis;
            lol.Add(a);
        }


И, собственно, сериализуем и сохраняем эти значения!
Код
        BinaryFormatter formatter = new BinaryFormatter();

            using (FileStream stream = new FileStream(Application.persistentDataPath + "/save.sav", FileMode.Create))
            {
                formatter.Serialize(Application.persistentDataPath + "/save.sav", levels);
            }


Так, ну а теперь загружаем наш levels:
Код

BinaryFormatter formatter = new BinaryFormatter();

            using (FileStream stream = new FileStream(Application.persistentDataPath + "/save.sav", FileMode.Open))
            {
                levels = (Dictionary<string, Level>)formatter.Deserialize(stream);
            }


Ну, как-то так. Может быть где-то промахнулся, но, думаю, ты разберешься.
vova1227Дата: Вторник, 02 Марта 2021, 23:10 | Сообщение # 3
был не раз
Сейчас нет на сайте
Спасибо конечно но это достаточно сложно пока что для меня. Я всего то хочу сохранить один тип объектов.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг