【问题标题】:Why when pressing the L key to load back the player rotation it's not doing anything?为什么当按下 L 键加载播放器旋转时它什么也没做?
【发布时间】:2019-12-12 22:48:22
【问题描述】:

保存状态类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public class SaveState
{
    public float RotationX { set; get; }
    public float RotationY { set; get; }
    public float RotationZ { set; get; }

    public DateTime LastSaveTime { set; get; }
}

存档管理器:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System;
using System.IO;

public class SaveManager : MonoBehaviour
{
    #region Instance
    private static SaveManager instance;
    public static SaveManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<SaveManager>();
                if (instance == null)
                {
                    instance = new GameObject("Spawned SaveManager", typeof(SaveManager)).GetComponent<SaveManager>();
                }
            }

            return instance;
        }
        set
        {
            instance = value;
        }
    }
    #endregion

    [Header("Logic")]
    [SerializeField] private string saveFileName = "data.dat";
    [SerializeField] private bool loadOnStart = true;
    private BinaryFormatter formatter;

    private SaveState state;
    public SaveState State { get => state; set => state = value; }

    private void Start()
    {
        // Init the formatter.
        formatter = new BinaryFormatter();
        DontDestroyOnLoad(this.gameObject);

        // If loadOnStart is true try to load the saved file.
        if (loadOnStart == true)
        {
            Load();
        }
    }

    public void Save()
    {
        // If no state
        if (state == null)
        {
            state = new SaveState();
        }

        //Set the time when trying to save.
        state.LastSaveTime = DateTime.Now;

        //Open the file.
        var file = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);
        formatter.Serialize(file, state);
        file.Close();
    }

    public void Load()
    {
        // Open file
        try
        {
            var file = new FileStream(saveFileName, FileMode.Open, FileAccess.Read);

            // Read file.
            state = (SaveState)formatter.Deserialize(file);
            file.Close();
        }
        catch
        {
            Debug.Log("No save file found, creating a new entry");
            Save();
        }
    }
}

还有一个测试脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SaveTest : MonoBehaviour
{
    private void Update()
    {
        SaveManager saveManager = SaveManager.Instance;

        if(Input.GetKeyDown(KeyCode.T))
        {
            var player = GameObject.Find("Player");
            saveManager.State.RotationX = player.transform.position.x;
            saveManager.State.RotationY = player.transform.position.y;
            saveManager.State.RotationZ = player.transform.position.z;

            saveManager.Save();
        }

        if(Input.GetKeyDown(KeyCode.L))
        {
            SaveManager.Instance.Load();
        }
    }
}

当我按下 T 键时,我使用了一个断点,它会在那里找到玩家。 但是当按下 L 键时它什么也不做,它不会将玩家旋转更改为已保存的内容。

我可以看到创建的文件是data.dat 256字节大小。

【问题讨论】:

标签: c# unity3d


【解决方案1】:

您只是从保存文件中加载数据,但实际上并未对数据进行任何操作。如果您想根据下载的state 中的任何数据设置播放器的旋转,您需要调用该数据。

public void Load()
{
    // Open file
    try
    {
       var file = new FileStream(saveFileName, FileMode.Open, FileAccess.Read);

       // Read file.
       state = (SaveState)formatter.Deserialize(file);
       file.Close();

       //After obtaining the SaveState we apply the values to our player's local rotation
       player.transform.localRotation = Quaternion.Euler(state.RotationX, state.RotationY, state.RotationZ);
    }
    catch
    {
       Debug.Log("No save file found, creating a new entry");
       Save();
    }
}

(请注意,虽然我在这里为您的 Load 方法中的播放器分配了值,但我建议在单独的方法中执行此操作以获得更简洁的代码)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多