UnitySaveSystem的学习总结

本文介绍了Unity引擎中两种常用的数据存储方法:PlayerPrefs和基于JSON的扩展。PlayerPrefs适合存储简单数据,而通过JsonUtility可以方便地存储复杂数据类型,如Prefab扩展。此外,构建了一个基于JSON的SaveSystem,用于持久化存储数据,包括保存、加载和删除功能。示例代码展示了如何在实际项目中应用这些方法。
摘要由CSDN通过智能技术生成

一.Player Prefs

Unity引擎内建的主要存储玩家偏好的类,也可以用来存储简单的数据

使用方法
在这里插入图片描述

优点:作为Unity本事自建的API简单易用,只需要调用上图所示的相应函数即可
缺点:存储比较复杂的数据时比较困难

二.利用JsonUtility对Prefabs进行扩展

JSON是一种特定格式的字符串,利用JSON我们可以将复杂数据类型通过Unity内建的JsonUtility转换成string,再通过Prefabs进行存储

首先我们编写一个简单的System,实现上述功能

//静态类,更方便调用且保证有且只有一个实例
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();
   }
}

现在我们将需要存储的复杂数据类型定义成一个类,与SaveSystem脚本交互实现存储功能

//编写一个数据存储类
 [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
}

如何使用SaveSystem

	 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);
        }

在这里插入图片描述
在这里插入图片描述
以上就是基于JSON构建的SaveSystem

学习来源

Ryan的个人空间链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值