Unity中常用的数据存储方式

1. PlayerPrefs(轻量级存储)

用途

保存简单的键值对数据,例如音量、分数、关卡进度等。
数据存储在本地设备上。

优点

使用简单。
跨平台支持。

缺点

适合轻量数据,不适合大规模数据。
数据未加密,容易被篡改。

示例代码

using UnityEngine;
public class PlayerPrefsExample : MonoBehaviour
{
void Start()
{
// 保存数据
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetString("PlayerName", "John");
// 读取数据
int highScore = PlayerPrefs.GetInt("HighScore", 0); // 默认值为0
string playerName = PlayerPrefs.GetString("PlayerName", "Unknown");
Debug.Log($"High Score: {highScore}, Player Name: {playerName}");
// 删除数据
PlayerPrefs.DeleteKey("HighScore");
}
}

2. 文件存储

用途

保存较复杂的数据结构,例如游戏设置、存档文件等。
常用格式:JSON、XML、二进制文件。

JSON 存储

优点

可读性强,易于调试。

缺点

无法直接加密。

示例代码

using UnityEngine;
using System.IO;
[System.Serializable]
public class GameData
{
public int level;
public float health;
public string playerName;
}
public class JSONSaveExample : MonoBehaviour
{
private string filePath;
void Start()
{
filePath = Path.Combine(Application.persistentDataPath, "GameData.json");
// 创建数据
GameData data = new GameData { level = 1, health = 100f, playerName = "Hero" };
// 保存为 JSON
string json = JsonUtility.ToJson(data);
File.WriteAllText(filePath, json);
Debug.Log($"Data saved to: {filePath}");
// 读取数据
if (File.Exists(filePath))
{
string loadedJson = File.ReadAllText(filePath);
GameData loadedData = JsonUtility.FromJson<GameData>(loadedJson);
Debug.Log($"Loaded Data: Level {loadedData.level}, Health {loadedData.health}, Name {loadedData.playerName}");
}
}
}

3. ScriptableObject(内置存储方案)

用途

保存静态数据,例如游戏配置、关卡数据等。
非运行时保存,需要配合其他方法持久化。

示例代码

创建 ScriptableObject 类

using UnityEngine;
[CreateAssetMenu(fileName = "GameSettings", menuName = "Data/GameSettings")]
public class GameSettings : ScriptableObject
{
public int difficultyLevel;
public float volume;
}

使用 ScriptableObject

using UnityEngine;
public class ScriptableObjectExample : MonoBehaviour
{
public GameSettings settings;
void Start()
{
Debug.Log($"Difficulty: {settings.difficultyLevel}, Volume: {settings.volume}");
}
}

4. SQLite(本地数据库)

用途

适合处理大量结构化数据,例如排行榜、玩家信息等。
Unity 使用 SQLite 插件 或 System.Data.SQLite。
安装 SQLite 插件(推荐使用 SQLite4Unity3d)。
操作数据库

using UnityEngine;
using SQLite4Unity3d;
public class SQLiteExample : MonoBehaviour
{
private SQLiteConnection db;
void Start()
{
string dbPath = Application.persistentDataPath + "/GameDatabase.db";
db = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create);
// 创建表
db.CreateTable<Player>();
// 插入数据
Player player = new Player { ID = 1, Name = "Hero", Score = 200 };
db.Insert(player);
// 查询数据
var players = db.Table<Player>();
foreach (var p in players)
{
Debug.Log($"Player: {p.Name}, Score: {p.Score}");
}
}
}
public class Player
{
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string Name { get; set; }
public int Score { get; set; }
}

5. 云存储(例如 Firebase)

用途

保存在线数据,例如多人游戏存档、排行榜、用户信息。
需要网络连接。

Firebase 示例代码

安装 Firebase SDK:通过 Unity Package Manager。
连接 Firebase 项目。
操作数据库

using Firebase.Database;
using UnityEngine;
public class FirebaseExample : MonoBehaviour
{
private DatabaseReference dbRef;
void Start()
{
dbRef = FirebaseDatabase.DefaultInstance.RootReference;
// 保存数据
dbRef.Child("players").Child("player1").SetValueAsync("John");
// 读取数据
dbRef.Child("players").Child("player1").GetValueAsync().ContinueWith(task =>
{
if (task.IsCompleted)
{
Debug.Log($"Player Name: {task.Result.Value}");
}
});
}
}

6. 加密与安全性

对于重要数据(如玩家隐私、游戏内购信息等),建议加密后存储。

AES 加密示例

using System;
using System.Security.Cryptography;
using System.Text;
public class EncryptionHelper
{
private static readonly string key = "YourEncryptionKey"; // 16/24/32位
public static string Encrypt(string plainText)
{
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = new byte[16];
var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
byte[] buffer = Encoding.UTF8.GetBytes(plainText);
return Convert.ToBase64String(encryptor.TransformFinalBlock(buffer, 0, buffer.Length));
}
}
public static string Decrypt(string cipherText)
{
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = new byte[16];
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
byte[] buffer = Convert.FromBase64String(cipherText);
return Encoding.UTF8.GetString(decryptor.TransformFinalBlock(buffer, 0, buffer.Length));
}
}
}

推荐存储方案总结

数据类型 推荐存储方式 备注
简单配置/设置 PlayerPrefs 轻量数据存储,不适合敏感数据。
游戏存档 JSON/XML 文件 简单、跨平台,需结合加密使用。
数据表格 SQLite 本地复杂数据管理。
在线存储 Firebase/云服务 实时同步、多设备共享。
静态数据(配置) ScriptableObject 易用性高,适合关卡或配置文件。
发布于   xiins  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
点击右上角即可分享
微信分享提示