Unity游戲數據用Json保存


(一)關於路徑

unity有幾個關鍵的路徑 

(1).Application.dataPath 只讀路徑,就是工作目錄的Assets路徑

(2).Application.streamingAssetsPath 只讀路徑,在pc可寫,程序打包后里面的所有資源都原封不動的打到游戲包里面

(3).Application.persistentDataPath 讀寫路徑,pc端:C:/Users/用戶名/AppData/LocalLow/公司名/包名/文件。 Android:Android/data/包名/file/文件 。 ios:ios8系統不允許訪問,但是你還是可以程序讀取寫入,但是外部無法看到。

從以上可以看出數據要保存讀取,所有路徑是用Application.persistentDataPath。

(二)關於Json插件

用於unity解析Json插件貌似有很多,這里列舉幾個比較常見的

(1)LitJson 用的人很多,但是有一次本人在一次IOS手機上出現過無法預知的錯誤,百度后貌似也有人碰到過。

(2)miniJson 很多項目中用到很多,本人倒是沒用過,不過見過很多商業項目用這個。

(3)SimpleJson 本人正在開發的項目中使用中,此次介紹也是使用這個插件。

(4)SimpleJson 下載地址 https://github.com/facebook-csharp-sdk/simple-json , 只要把SimpleJson.cs下載放入工程即可。

()加密解密算法

(1)使用C#自帶的des算法,需要引入 

using System.Security.Cryptography;

 

()代碼示例

(1)數據對象: (最近發現序列化的時候成員必須是 get set 的形式,不然會報錯,原因不知)

public class PlayerData 
{
    public int gold { get; set ; }
    public int level { get; set; }
    public string name { get; set; }      
}

聲明數據對象實例,用一個靜態變量保存,使之在整個游戲過程都不會刪除

public class GlobalData 
{
    public static PlayerData playerData = new PlayerData();
}

(2)數據讀取和保存操作

using UnityEngine;
using System.Collections;
using SimpleJson;

public class PlayerDataStore
{
    private static string fileName = "data.txt";
    private static string key = "this key";

    //游戲開始時加載;
    public static bool Reader()
    {
        string txt = Helper.ReadText(fileName);
        if (string.IsNullOrEmpty(txt))
        {
            GlobalData.playerData = new PlayerData();
            Debug.LogWarning("login first time.");
            return false;
        }
        txt = Helper.DecryptString(txt, key);
        GlobalData.playerData  = SimpleJson.SimpleJson.DeserializeObject<PlayerData>(txt);
        return true;
    }

    //游戲結束和數據改變的時候保存;
    public static bool Writer()
    {
        if (GlobalData.playerData == null)
        {
            return false;
        }
        string jsd = SimpleJson.SimpleJson.SerializeObject(GlobalData.playerData);
        jsd = Helper.EncryptString(jsd, key);
        return Helper.WriteText(fileName, jsd);
    }
}

(3)加密解密函數

using System.Security.Cryptography;

public
class Helper { //加密; public static string EncryptString(string str, string key) { byte[] buffer; UTF8Encoding encoding = new UTF8Encoding(); MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); byte[] buffer2 = provider.ComputeHash(encoding.GetBytes(key)); TripleDESCryptoServiceProvider provider2 = new TripleDESCryptoServiceProvider { Key = buffer2, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; byte[] bytes = encoding.GetBytes(str); try { buffer = provider2.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length); } finally { provider2.Clear(); provider.Clear(); } return Convert.ToBase64String(buffer); } //解密; public static string DecryptString(string str, string key) { byte[] buffer; UTF8Encoding encoding = new UTF8Encoding(); MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); byte[] buffer2 = provider.ComputeHash(encoding.GetBytes(key)); TripleDESCryptoServiceProvider provider2 = new TripleDESCryptoServiceProvider { Key = buffer2, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; try { byte[] inputBuffer = Convert.FromBase64String(str); buffer = provider2.CreateDecryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length); } catch (Exception ex) { Debug.LogError("DecryptString failed. return empty string." + ex.Message); return ""; } finally { provider2.Clear(); provider.Clear(); } return encoding.GetString(buffer); } }

(4)游戲結束或數據改變時保存

public class SceneManager : MonoBehaviour
{    
    void Start()
    {
        PlayerDataStore.Reader();
    }
   void OnDestroy()
    {
        if(PlayerDataStore.Writer()==false)
        {
            Debug.LogError("writer file failed.");
        }     
    }
}    

在移動平台就麻煩一點,因為移動平台難以捕獲游戲關閉的回調,像Android殺死進程,或者是我Android太爛的緣故。這個時候就需要在數據一改變就執行一次保存,防止數據丟失。

(5)SimpleJson的其他簡單用法

private void GameInit()
{
    SimpleJson.JsonArray jsa = SimpleJson.SimpleJson.DeserializeObject("[]") as SimpleJson.JsonArray;
    SimpleJson.JsonObject jso = SimpleJson.SimpleJson.DeserializeObject("{}") as SimpleJson.JsonObject;
    jso["cc"] = "dd";
    jso["bb"] = 1;
    jsa.Add(jso);
    Debug.LogError(jsa.ToString());
}

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM