[System.Serializable]
public class GameData
{
public int playerLevel;
public float health;
public List<string> inventoryItems;
public GameData()
{
playerLevel = 1;
health = 100.0f;
inventoryItems = new List<string>();
}
}
using UnityEngine;
using System.IO;
public static class SaveLoadManager
{
private static string saveFilePath = Path.Combine(Application.persistentDataPath, "gamedata.json");//データの保存先 , 保存データの名前
// ゲームデータを保存する(どこからでも呼べるようにstatic)
public static void SaveGame(GameData data)
{
string json = JsonUtility.ToJson(data, true);
File.WriteAllText(saveFilePath, json);
Debug.Log("Game data saved to " + saveFilePath);
}
// ゲームデータを読み込む
public static GameData LoadGame()
{
if (File.Exists(saveFilePath))
{
string json = File.ReadAllText(saveFilePath);
GameData data = JsonUtility.FromJson<GameData>(json);
Debug.Log("Game data loaded from " + saveFilePath);
return data;
}
else
{
Debug.LogWarning("Save file not found in " + saveFilePath);
return new GameData(); // デフォルトのゲームデータを返す
}
}
}
using UnityEngine;
public class GameController : MonoBehaviour
{
private GameData currentGameData;
private void Start()
{
// ゲームデータの読み込み
currentGameData = SaveLoadManager.LoadGame();
// 現在のゲームデータを表示
Debug.Log("Player Level: " + currentGameData.playerLevel);
Debug.Log("Health: " + currentGameData.health);
Debug.Log("Inventory Items: " + string.Join(", ", currentGameData.inventoryItems));
// ゲームデータの変更
currentGameData.playerLevel++;
currentGameData.health -= 10.0f;
currentGameData.inventoryItems.Add("Sword");
// ゲームデータの保存
SaveLoadManager.SaveGame(currentGameData);
}
}
UnityでゲームデータをJSON形式で保存し、そのデータをAES暗号化で保護する方法
Unityプロジェクトを作成し、以下のスクリプトをプロジェクト内に追加します。必要なスクリプトは以下の通りです:
GameData.cs AESCrypto.cs SaveLoadManager.cs GameController.cs
まず、保存するゲームデータの構造を定義します。このクラスはシリアライズ可能である必要があります。
playerLevel: プレイヤーのレベル。 health: プレイヤーの体力。 inventoryItems: プレイヤーが持っているアイテムのリスト
[System.Serializable]
public class GameData
{
public int playerLevel;
public float health;
public List<string> inventoryItems;
public GameData()
{
playerLevel = 1;
health = 100.0f;
inventoryItems = new List<string>();
}
}
AESCrypto クラスは、文字列データをAES暗号化および復号するための静的メソッドを作成
Encrypt: 平文のテキストを暗号化します。 Decrypt: 暗号化されたテキストを復号します。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
public static class AESCrypto
{
private static readonly string encryptionKey = "your-encryption-key-here"; // 必ず16, 24, 32文字にする
public static string Encrypt(string plainText)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
using (Aes aes = Aes.Create())
{
aes.Key = keyBytes;
aes.GenerateIV();
byte[] iv = aes.IV;
using (var encryptor = aes.CreateEncryptor(aes.Key, iv))
using (var ms = new MemoryStream())
{
ms.Write(iv, 0, iv.Length);
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
using (var sw = new StreamWriter(cs))
{
sw.Write(plainText);
}
return Convert.ToBase64String(ms.ToArray());
}
}
}
public static string Decrypt(string cipherText)
{
byte[] cipherBytes = Convert.FromBase64String(cipherText);
byte[] keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
using (Aes aes = Aes.Create())
{
aes.Key = keyBytes;
using (var ms = new MemoryStream(cipherBytes))
{
byte[] iv = new byte[16];
ms.Read(iv, 0, iv.Length);
aes.IV = iv;
using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
using (var sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
}
}
}
ゲームデータを保存および読み込むためのクラスです。 データはJSON形式で保存され、保存時にAESで暗号化されます 読み込み時に復号されます。
SaveGame: GameDataオブジェクトをJSON形式で保存し、AESで暗号化します。 LoadGame: 暗号化されたJSONデータを読み込み、AESで復号してGameDataオブジェクトに変換します。
using UnityEngine;
using System.IO;
public static class SaveLoadManager
{
private static string saveFilePath = Path.Combine(Application.persistentDataPath, "gamedata.json");
// ゲームデータを保存する
public static void SaveGame(GameData data)
{
string json = JsonUtility.ToJson(data, true);
string encryptedJson = AESCrypto.Encrypt(json);
File.WriteAllText(saveFilePath, encryptedJson);
Debug.Log("Game data saved to " + saveFilePath);
}
// ゲームデータを読み込む
public static GameData LoadGame()
{
if (File.Exists(saveFilePath))
{
string encryptedJson = File.ReadAllText(saveFilePath);
string json = AESCrypto.Decrypt(encryptedJson);
GameData data = JsonUtility.FromJson<GameData>(json);
Debug.Log("Game data loaded from " + saveFilePath);
return data;
}
else
{
Debug.LogWarning("Save file not found in " + saveFilePath);
return new GameData(); // デフォルトのゲームデータを返す
}
}
}
クラスは、ゲームの開始時にデータを読み込み、データを変更し、変更後のデータを保存する例です。
using UnityEngine;
public class GameController : MonoBehaviour
{
private GameData currentGameData;
private void Start()
{
// ゲームデータの読み込み
currentGameData = SaveLoadManager.LoadGame();
// 現在のゲームデータを表示
Debug.Log("Player Level: " + currentGameData.playerLevel);
Debug.Log("Health: " + currentGameData.health);
Debug.Log("Inventory Items: " + string.Join(", ", currentGameData.inventoryItems));
// ゲームデータの変更
currentGameData.playerLevel++;
currentGameData.health -= 10.0f;
currentGameData.inventoryItems.Add("Sword");
// ゲームデータの保存
SaveLoadManager.SaveGame(currentGameData);
}
}
書き方の例
JsonSaveUtility.cs
using System.IO;
using UnityEngine;
public static class JsonSaveUtility
{
public static string SaveFilePath = $"{Application.persistentDataPath}/SaveData.json";
public static void Save<T>(T data) where T : class
{
string json = JsonUtility.ToJson(data);
File.WriteAllText(SaveFilePath, json);
Debug.Log(SaveFilePath);
}
public static T Load<T>()where T : class
{
if (!File.Exists(SaveFilePath))
{
string json = File.ReadAllText(SaveFilePath);
return JsonUtility.FromJson<T>(json);
}
else
{
Debug.Log("ファイルがありません。");
return null;
}
}
}
PlayerSaveData.cs
namespace SampleGame1
{
[System.Serializable]
public class PlayerSaveData
{
public string name;
public int score;
public PlayerSaveData(string name ,int score)
{
this.name = name;
this.score = score;
}
}
}
Sample.cs
using UnityEngine;
class Sample : MonoBehaviour {
void Start() {
var SaveData = new SampleGame1.PlayerSaveData(string.Empty, 0);
JsonSaveUtility.Save(SaveData);
}
}