Uniyt引擎中常见的数据存取方式
一.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