unity 记录本地
时间: 2025-06-14 09:54:43 浏览: 12
### Unity 中实现本地存储与数据持久化的常见方法
在 Unity 开发中,数据持久化是一个重要的功能需求。以下是几种常见的实现方式及其具体操作:
#### 1. **PlayerPrefs**
`PlayerPrefs` 是 Unity 提供的一种简单易用的键值对存储机制,适合用于保存少量配置信息或玩家偏好设置。
- `PlayerPrefs.SetString(key, value)` 和 `PlayerPrefs.GetString(key)` 可分别用来写入和读取字符串类型的键值对[^3]。
- 示例代码如下:
```csharp
// 写入数据
PlayerPrefs.SetString("playerName", "John");
PlayerPrefs.SetInt("highScore", 100);
PlayerPrefs.Save(); // 别忘了手动调用 Save() 来确保数据被实际保存
// 读取数据
string playerName = PlayerPrefs.GetString("playerName", "DefaultName"); // 默认值为 DefaultName
int highScore = PlayerPrefs.GetInt("highScore", 0); // 默认值为 0
```
需要注意的是,在 WebGL 平台上,Unity 使用浏览器的 IndexedDB API 存储 `PlayerPrefs` 数据[^5]。
---
#### 2. **JSON 文件存储**
通过 JSON 序列化可以将复杂对象结构转化为易于解析的文本格式并保存至磁盘上。
##### a. 使用内置 JsonUtility 类型
这是最基础的方式之一,适用于简单的类定义。
- 需要先创建一个可序列化的 C# 对象(标记 `[System.Serializable]` 属性),再利用 `JsonUtility.ToJson()` 进行序列化处理[^4]。
示例代码展示如何保存和加载自定义的游戏状态:
```csharp
[System.Serializable]
public class GameData {
public int score;
public string playerName;
}
void SaveGameData(GameData data) {
string json = JsonUtility.ToJson(data); // 将对象转成 JSON 字符串
File.WriteAllText(Application.persistentDataPath + "/savefile.json", json); // 写入文件
}
GameData LoadGameData() {
string filePath = Application.persistentDataPath + "/savefile.json";
if (File.Exists(filePath)) { // 如果存在则尝试加载
string json = File.ReadAllText(filePath);
return JsonUtility.FromJson<GameData>(json); // 解析回对象
}
return null; // 若无存档返回空实例
}
```
##### b. 第三方库 Newtonsoft.Json 支持更高级特性
如果项目中有特殊类型比如 Vector 或 Color,则推荐引入 NuGet 包 “Newtonsoft.Json”,它提供了更为灵活强大的扩展能力。
安装完成后可以直接这样使用:
```csharp
using Newtonsoft.Json;
string jsonString = JsonConvert.SerializeObject(yourObjectWithVectorsColorsEtc);
YourType deserializedObj = JsonConvert.DeserializeObject<YourType>(jsonString);
```
---
#### 3. **二进制序列化**
对于性能敏感的应用程序来说,采用二进制格式可能更加高效。可以通过 .NET Framework 的 BinaryFormatter 完成此过程[^2]。
注意:由于安全性和兼容性的原因,官方文档建议谨慎选用该方案,并考虑替代品如 Protobuf 等框架。
下面给出一段基本示范:
```csharp
private void SerializeToBinary(object obj, string path){
using(var stream=new FileStream(path FileMode.Create)){
var formatter= new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(stream,obj);
}
}
private object DeserializeFromBinary(string path){
using(var stream=new FileStream(path FileMode.Open)){
var formatter= new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
return formatter.Deserialize(stream);
}
}
```
---
#### 4. **SQLite 数据库存储**
当面对大量关系型数据时,嵌入式 SQL 轻量级解决方案 SQLite 成为了理想选择。借助插件 OrmLite 或者直接编写原生语句均可完成相应任务[^1]。
例如初始化连接池以及执行 CRUD 操作均需遵循标准流程...
---
总结而言,开发者应依据实际情况权衡不同技术路线优劣后再做决定。每种手段都有其适用范围及局限之处。
阅读全文
相关推荐

















