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 | 易用性高,适合关卡或配置文件。 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签