Как реализовать систему сохранений и загрузки в Unity для сцен и позиции игрока

Рейтинг: 0Ответов: 0Опубликовано: 24.08.2023

Работаем над рпг игрой с товарищем. Столкнулись с проблемой загрузки игры.

Наша логика:

  1. Класс для хранения данных
  2. При сохранении заполнять класс нужными данными и создать JSON (знаем, что есть другие способы, пока просто работаем с этим)
  3. При загрузке доставать данные из JSON и выполнить нужные функции для настройки нужных вещей.

Сохраняем мы пока только позицию игрока и сцену (локацию), на которой было нажато сохранение. Сохранение и загрузка работают нормально с позицией игрока.

Код:

public class SaveGame: MonoBehaviour
{

    private SaveData saveData = new SaveData();

    public void SaveParameters()
    {
        saveData.sceneName = SceneManager.GetActiveScene().name;

        GameObject playerObject = GameObject.FindWithTag("Player");
        saveData.playerPosition = playerObject.transform.position;

        Debug.Log("Save sceneName: " + saveData.sceneName + "\nSave playerPosition: " + saveData.playerPosition);

        string json = JsonUtility.ToJson(saveData);
        File.WriteAllText(Application.persistentDataPath + "/save.json", json);
    }

    public void LoadParametrs()
    {
        string path = Application.persistentDataPath + "/save.json";
        string json = File.ReadAllText(path);
        saveData = JsonUtility.FromJson<SaveData>(json);

        Debug.Log("Load sceneName: " + saveData.sceneName + "\nLoad playerPosition: " + saveData.playerPosition);

        SceneManager.LoadScene(saveData.sceneName);
        GameObject playerObject = GameObject.FindWithTag("Player");
        playerObject.transform.position = new Vector3(saveData.playerPosition.x, saveData.playerPosition.y, saveData.playerPosition.z);
        return;
    }
}

[System.Serializable]
public class SaveData
{
    public string sceneName;
    public Vector3 playerPosition;
}

Теперь о том, что происходит при загрузке. Персонаж на кадр перемещается в нужную позицию, но потом сразу перемещается в начальные координаты (на каждой сцене свой Player), плюсом он не может ходить, хотя все нужные скрипты привязаны и значения правильные. Нашли подобную проблему здесь, но ничего полезного выяснить не удалось: https://gamedev.stackexchange.com/questions/120256/what-would-be-a-perfect-manner-to-load-a-scene-then-the-players-position-in-uni

В туториалах никто не затрагивает подобную тему. Как реализовать нашу задумку? Возможно наша концепция не верна либо нужно по другому работать со сценами. Любая помощью будет ценна.

Ответы

Ответов пока нет.