0
点赞
收藏
分享

微信扫一扫

UnitySaveSystem的学习总结

桑二小姐 2022-02-08 阅读 95

Uniyt引擎中常见的数据存取方式

一.Player Prefs

二.利用JsonUtility对Prefabs进行扩展

//静态类,更方便调用且保证有且只有一个实例
public static class SaveSystem   
{
   //object是c#所有类的基类,确保了它可以存储任意类型,再通过JsonUtility转换成特殊格式的string
   //然后将该string用Prefabs存储
   public static void SaveByPlayerPrefs(string key,object data)
   {
       string json = JsonUtility.ToJson(data);
       PlayerPrefs.SetString(key,json);
       PlayerPrefs.Save();

       #if UNITY_EDITOR
       Debug.Log("Successfully saved data to PlayerPrefs.");
       #endif
   }

   public static string LoadFromPlayerPrefs(string key)
   {
       //如果key没有对应的string则返回Null
       return PlayerPrefs.GetString(key,null);
   }

   [UnityEditor.MenuItem("Developer/Delete All Key")]
   public static void DeletePlayerDataPrefs()
   {
       PlayerPrefs.DeleteAll();
   }
}
//编写一个数据存储类
 [System.Serializable] class SaveData
 {
     public string playerName;
     public int playerLevel;
     public int playerCoin;
     public Vector3 playerPosition;
 }

//两个相关的存储与读取函数
#region SaveByJSON
void SaveByJSON()
{
    SaveData saveData = new SaveData();
    saveData.playerName = playerName;
    saveData.playerLevel = level;
    saveData.playerCoin = coin;
    saveData.playerPosition = transform.position;

    SaveSystem.SaveByPlayerPrefs("PlayerData",saveData);
}
void LoadByJSON()
{
    string json = SaveSystem.LoadFromPlayerPrefs("PlayerData");
    if (json == null)
    {
        Debug.Log("读取失败,请检查key是否正确!!!");
        return;
    }
    SaveData saveData = JsonUtility.FromJson<SaveData>(json);
    playerName = saveData.playerName;
    level = saveData.playerLevel;
    coin = saveData.playerCoin;
    transform.position = saveData.playerPosition;
}
#endregion

三.构建一个基于JSON的SaveSystem

 //静态类,更方便调用且保证有且只有一个实例
public static class SaveSystem  
{      
 #region JSON
    public static void SaveByJson(string saveFileName,object data)
    {
        string json =  JsonUtility.ToJson(data);
        string path = Path.Combine(Application.persistentDataPath,saveFileName);          
        try
        {
            File.WriteAllText(path, json);
            Debug.Log($"Successfully saved data to {path}.");
        }
        catch (System.Exception e)
        {
            Debug.LogError($"Failed to save data to {path}.\n{e}");
        }
    }

    public static T LoadFromJson<T>(string saveFileName)
    {
        string path = Path.Combine(Application.persistentDataPath, saveFileName);
        string json = File.ReadAllText(path);   
        try
        {
            var data = JsonUtility.FromJson<T>(json);
            return data;
        }
        catch (System.Exception e)
        {
            Debug.LogError($"Failed to save data to {path}.\n{e}");
            return default;
        }

    }

    public static void DeleteSaveFile(string saveFileName)
    {
        string path = Path.Combine(Application.persistentDataPath, saveFileName);
        try
        {
            File.Delete(path);
        }
        catch (System.Exception e)
        {
            Debug.LogError($"Failed to delete data to {path}.\n{e}");
            throw;
        }
    }
 #endregion
}
	 const string PLAYER_DATA_FILE = "player.data";
        void SaveByJSON()
        {
            SaveData saveData = new SaveData();
            saveData.playerName = playerName;
            saveData.playerLevel = level;
            saveData.playerCoin = coin;
            saveData.playerPosition = transform.position;
            SaveSystem.SaveByJson(PLAYER_DATA_FILE, saveData);
        }
        void LoadByJSON()
        {
            SaveData saveData = SaveSystem.LoadFromJson<SaveData>(PLAYER_DATA_FILE);
            playerName = saveData.playerName;
            level = saveData.playerLevel;
            coin = saveData.playerCoin;
            transform.position = saveData.playerPosition;
        }

        [UnityEditor.MenuItem("Developer/Delete Player data")]
        public static void DeletePlayerDataSaveFile()
        {
            SaveSystem.DeleteSaveFile(PLAYER_DATA_FILE);
        }

学习来源

举报

相关推荐

0 条评论