Загрузка сцены из меню

Общие вопросы о Unity3D

Загрузка сцены из меню

Сообщение Gidly 29 июл 2018, 20:58

Добрый вечер, возникла проблема. Создал сцену меню, с кнопками и всеми делами, начать игру-загрузить сцену самой игры было не сложно, но как сделать так, чтобы загружалось сохранение(оно пока не доработано, но не суть). Вот скрипт сохранения и загрузки игры:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;


public class Saver : MonoBehaviour {
    public GameObject player;
    [System.Serializable]
    public class Position
    {
        public float x;
        public float y;
        public float z;
    }

    public void Save()
    {
        Position position = new Position();
        position.x = player.transform.position.x;
        position.y = player.transform.position.y;
        position.z = player.transform.position.z;

        if (!Directory.Exists(Application.dataPath + "/Saved Games"))
            Directory.CreateDirectory(Application.dataPath + "/Saved Games");
        FileStream fs = new FileStream(Application.dataPath + "/Saved Games/save.sav", FileMode.Create);
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(fs, position);
        fs.Close();

    }
    public void Load()
    {
        if(File.Exists(Application.dataPath + "/Saved Games/save.sav"))
        {
            FileStream fs = new FileStream(Application.dataPath + "/Saved Games/save.sav", FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            try
            {
                Position pos = (Position)formatter.Deserialize(fs);
                player.transform.position = new Vector3(pos.x, pos.y, pos.z);
            }
            catch(System.Exception e)
            {
                Debug.Log(e.Message);
            }
            finally
            {
                fs.Close();
            }
        }
        else
        {
            Application.Quit();
        }
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }
        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }
}
 

А вот скрипт менюшки:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;


public class Start_Menu : MonoBehaviour {

    public GameObject player;
    public Scene pers;
    public class Position
    {
        public float x;
        public float y;
        public float z;
    }
    public void StartGame()
    {
        SceneManager.LoadScene(1);
    }
    public void LoadGame()
    {

    }
    public void Settings()
    {

    }
    public void Authors()
    {

    }
    public void Quit()
    {
        Application.Quit();
    }
}
 
Аватара пользователя
Gidly
UNIт
 
Сообщения: 61
Зарегистрирован: 07 июл 2018, 19:20
Откуда: Из Бангладеша

Re: Загрузка сцены из меню

Сообщение 1max1 29 июл 2018, 21:14

Зачем тебе бинарное сохранение, когда есть https://docs.unity3d.com/ScriptReferenc ... ility.html
И не надо вектор раскладывать на х, y, z, и не нужно никаких потоков и прочей фигни, можно сразу через File.WriteAllText сохранить.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Загрузка сцены из меню

Сообщение Gidly 31 июл 2018, 01:45

1max1 писал(а):Зачем тебе бинарное сохранение, когда есть https://docs.unity3d.com/ScriptReferenc ... ility.html
И не надо вектор раскладывать на х, y, z, и не нужно никаких потоков и прочей фигни, можно сразу через File.WriteAllText сохранить.

Я не знаю, чувак, через json не получилось, но через xml более менее, но я понять не могу, почему он хоть ты тресни сохраняет только позицию игрока, а должен сохранять еще и количество патронов и жизней из других скриптов
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml.Serialization;
using System.IO;


[System.Serializable]
public class SavePosAmmo
{
    public int ammo;
    public int health;
    public float x;
    public float y;
    public float z;
}

public class SaveGame_ : MonoBehaviour
{
    AK ak;
    Pers_control pers;
    public int ammo;
    public int health;
    void Start()
    {
        pers = GetComponent<Pers_control>();
        ak = GetComponent<AK>();
        ammo = ak.CurAmmo;
        health = pers.health;
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }
        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }

    public void Save()
    {
        var xml = new XmlSerializer(typeof(SavePosAmmo));
        var save = new SavePosAmmo();
        save.x = transform.position.x;
        save.y = transform.position.y;
        save.z = transform.position.z;

        using (var stream = new FileStream("save.xml", FileMode.Create, FileAccess.Write))
        {
            xml.Serialize(stream, save);
        }
        Debug.Log("Saved complete");
    }
    public void Load()
    {
        var xml = new XmlSerializer(typeof(SavePosAmmo));
        var save = new SavePosAmmo();
        using (var stream = new FileStream("save.xml", FileMode.Open, FileAccess.Read))
        {
            save = xml.Deserialize(stream) as SavePosAmmo;
        }
            ammo = save.ammo;
            health = save.health;
            transform.position = new Vector3(save.x, save.y, save.z);
    }
}
 
Аватара пользователя
Gidly
UNIт
 
Сообщения: 61
Зарегистрирован: 07 июл 2018, 19:20
Откуда: Из Бангладеша

Re: Загрузка сцены из меню

Сообщение 1max1 31 июл 2018, 05:01

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

Я вот что-то не увидел чтобы ты хоть где-то аммо сохранял и жизни
Синтаксис:
Используется csharp
public void Save()
    {
        var xml = new XmlSerializer(typeof(SavePosAmmo));
        var save = new SavePosAmmo();
        save.x = transform.position.x;
        save.y = transform.position.y;
        save.z = transform.position.z;

        using (var stream = new FileStream("save.xml", FileMode.Create, FileAccess.Write))
        {
            xml.Serialize(stream, save);
        }
        Debug.Log("Saved complete");
    }
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Загрузка сцены из меню

Сообщение Gidly 31 июл 2018, 09:58

1max1 писал(а):
но я понять не могу, почему он хоть ты тресни сохраняет только позицию игрока, а должен сохранять еще и количество патронов и жизней из других скриптов

Я вот что-то не увидел чтобы ты хоть где-то аммо сохранял и жизни
Синтаксис:
Используется csharp
public void Save()
    {
        var xml = new XmlSerializer(typeof(SavePosAmmo));
        var save = new SavePosAmmo();
        save.x = transform.position.x;
        save.y = transform.position.y;
        save.z = transform.position.z;

        using (var stream = new FileStream("save.xml", FileMode.Create, FileAccess.Write))
        {
            xml.Serialize(stream, save);
        }
        Debug.Log("Saved complete");
    }
 

Ну, так тоже не работает:
Синтаксис:
Используется csharp
 public void Save()
    {
        var xml = new XmlSerializer(typeof(SavePosAmmo));
        var save = new SavePosAmmo();

        save.health = health;
        save.ammo = ammo;
        save.x = transform.position.x;
        save.y = transform.position.y;
        save.z = transform.position.z;


        using (var stream = new FileStream("save.xml", FileMode.Create, FileAccess.Write))
        {
            xml.Serialize(stream, save);
        }
        Debug.Log("Saved complete");
    }
Аватара пользователя
Gidly
UNIт
 
Сообщения: 61
Зарегистрирован: 07 июл 2018, 19:20
Откуда: Из Бангладеша

Re: Загрузка сцены из меню

Сообщение 1max1 31 июл 2018, 10:34

Синтаксис:
Используется csharp
[System.Serializable]
public class SaveData
{
    public int ammo;
    public int health;
    public Vector3 pos;
}

public class SaveManager : MonoBehaviour
{
    public int ammo;
    public int health;
    public Vector3 pos;

    void Start()
    {
        Load();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }

    public void Save()
    {
        SaveData save = new SaveData();

        save.ammo = ammo;
        save.health = health;
        save.pos = transform.position;

        string json = JsonUtility.ToJson(save);

        System.IO.File.WriteAllText("save.dat", json);
    }

    public void Load()
    {
        string json = System.IO.File.ReadAllText("save.dat");

        if (!string.IsNullOrEmpty(json))
        {
            var save = JsonUtility.FromJson<SaveData>(json);

            ammo = save.ammo;
            health = save.health;
            transform.position = save.pos;
        }
    }
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Загрузка сцены из меню

Сообщение Gidly 03 авг 2018, 17:26

1max1 писал(а):
Синтаксис:
Используется csharp
[System.Serializable]
public class SaveData
{
    public int ammo;
    public int health;
    public Vector3 pos;
}

public class SaveManager : MonoBehaviour
{
    public int ammo;
    public int health;
    public Vector3 pos;

    void Start()
    {
        Load();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }

    public void Save()
    {
        SaveData save = new SaveData();

        save.ammo = ammo;
        save.health = health;
        save.pos = transform.position;

        string json = JsonUtility.ToJson(save);

        System.IO.File.WriteAllText("save.dat", json);
    }

    public void Load()
    {
        string json = System.IO.File.ReadAllText("save.dat");

        if (!string.IsNullOrEmpty(json))
        {
            var save = JsonUtility.FromJson<SaveData>(json);

            ammo = save.ammo;
            health = save.health;
            transform.position = save.pos;
        }
    }
}
 

Я почти разобрался, и поставил вроде должно и Жизни сохранять, но юнька матерится: ссылка на объект не указывает на экземпляр объекта
Вот что я добавил:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class SaveData
{
   public Pers_control control;
    public int ammo;
    public int health;
    public Vector3 pos;
}

public class SaveSystem : MonoBehaviour
{
    public AK AK;
    public Pers_control pers;
    public int ammo;
    public int health;
    public Vector3 pos;

    void Start()
    {
        Load();
        ammo = AK.CurAmmo;
        health = pers.health;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }

    public void Save()
    {
        SaveData save = new SaveData();

        save.ammo = ammo;
        save.health = health;
        save.pos = transform.position;
        save.control.health = pers.health

        string json = JsonUtility.ToJson(save);

        System.IO.File.WriteAllText("save.dat", json);
    }

    public void Load()
    {
        string json = System.IO.File.ReadAllText("save.dat");

        if (!string.IsNullOrEmpty(json))
        {
            var save = JsonUtility.FromJson<SaveData>(json);

            ammo = save.ammo;
            health = save.health;
            transform.position = save.pos;
            pers.health = save.control.health;
        }
    }
}
 

Cпасибо за скрипт!
Аватара пользователя
Gidly
UNIт
 
Сообщения: 61
Зарегистрирован: 07 июл 2018, 19:20
Откуда: Из Бангладеша


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 5