iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Software Development

Unity黑科技揭秘:30個專業遊戲開發者必知的開發技巧系列 第 17

Unity Config - 製作加密的遊戲存檔方法!

  • 分享至 

  • xImage
  •  

1. 創建一個需要保存的 Class

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int playerLevel;
    public float playerHealth;

    public PlayerData(string name, int level, float health)
    {
        playerName = name;
        playerLevel = level;
        playerHealth = health;
    }
}

2. 使用 JSON 序列化將 Class 轉換為 JSON

PlayerData playerData = new PlayerData("Yapi", 10, 100f);
string json = JsonUtility.ToJson(playerData);

3. 使用 AES 加密 JSON 文本


https://assetstore.unity.com/packages/tools/input-management/simple-encryption-md5-base64-aes-rsa-29403

我們將使用推薦的 Simple Encryption 插件來進行 AES 加密。
確保你已在 Unity 中安裝了該插件。

4. 使用 File.WriteAllText 保存加密後的數據

為了確保數據在下次啓動遊戲時可以被讀取
我們將加密後的 JSON 文本保存到 Unity 的 PersistentDataPath 中。

string filePath = System.IO.Path.Combine(Application.persistentDataPath, "playerData.dat");
System.IO.File.WriteAllText(filePath, encryptedData);

5. 讀取時使用 AES 解密,並還原為 Class

讀取保存的數據時,
我們需要先讀取文件內容,
再通過 AES 解密,將 JSON 轉換回原始的 Class。

public string DecryptData(string encryptedData, string encryptionKey)
{
    return Encryption.DecryptString(encryptedData, encryptionKey);
}

string loadedData = System.IO.File.ReadAllText(filePath);
string decryptedData = DecryptData(loadedData, encryptionKey);
PlayerData loadedPlayerData = JsonUtility.FromJson<PlayerData>(decryptedData);

完整示例

以下是完整的代碼示例,展示了從保存到讀取的整個流程:

using UnityEngine;
using SimpleEncryption;

public class DataManager : MonoBehaviour
{
    private string encryptionKey = "your-encryption-key";

    [ContextMenu("Save Data")]
    public void SaveData()
    {
        PlayerData playerData = new PlayerData("Yapi", 10, 100f);
        string json = JsonUtility.ToJson(playerData);
        string encryptedData = Encryption.EncryptString(json, encryptionKey);
        string filePath = System.IO.Path.Combine(Application.persistentDataPath, "playerData.dat");
        System.IO.File.WriteAllText(filePath, encryptedData);
        Debug.Log("Data Saved: " + encryptedData);
    }

    [ContextMenu("Load Data")]
    public void LoadData()
    {
        string filePath = System.IO.Path.Combine(Application.persistentDataPath, "playerData.dat");
        if (System.IO.File.Exists(filePath))
        {
            string loadedData = System.IO.File.ReadAllText(filePath);
            string decryptedData = Encryption.DecryptString(loadedData, encryptionKey);
            PlayerData loadedPlayerData = JsonUtility.FromJson<PlayerData>(decryptedData);
            Debug.Log("Data Loaded: " + decryptedData);
        }
        else
        {
            Debug.LogWarning("Save file not found!");
        }
    }
}

上一篇
Unity API - 如何串接所有的開放API?
下一篇
Unity Firebase - 使用Firebase進行用戶註冊登入!
系列文
Unity黑科技揭秘:30個專業遊戲開發者必知的開發技巧25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言