Unity中常用的数据存储方式

news/2025/1/6 16:30:55/文章来源:https://www.cnblogs.com/xiins/p/18652246

1. PlayerPrefs(轻量级存储)

用途

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

优点

使用简单。
跨平台支持。

缺点

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

示例代码

using UnityEngine;public class PlayerPrefsExample : MonoBehaviour
{void Start(){// 保存数据PlayerPrefs.SetInt("HighScore", 100);PlayerPrefs.SetString("PlayerName", "John");// 读取数据int highScore = PlayerPrefs.GetInt("HighScore", 0); // 默认值为0string 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" };// 保存为 JSONstring 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 易用性高,适合关卡或配置文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863953.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G核心网短信解决方案概述

短信作为传统无线网络的基础业务,随着移动网络的飞速发展,我们会发现,在日常生活中我们使用短信进行沟通的情况越来越少了。但是在我们使用各种业务的时候,仍然离不开短信,例如: 注册新的APP、密码找回,快递取件,收发验证码等,对于安全性要求较高的业务,更要使用短信…

docker 安装doris

下载镜像docker pull apache/doris:build-env-ldb-toolchain-latest下载安装包 https://doris.apache.org/zh-CN/downloadwget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.1.7-bin-x64.tar.gz然后需要下载MySQL,这里提供MySQL的免安装版MySQL…

Windows单机安装MongoDB分片集群

Windows单机部署MongoDB分片集群 规划和准备 端口规划 操作系统:Windows Server 2012 MongoDB版本:4.2.25IP/节点名 mongos config shard1 shard2 shard3127.0.0.1(mongo1) mongos1(27017) config1(27018) 主(27001) 主(27002) 主(27003)127.0.0.1(mongo2) mongos2(27027…

学习-Nginx-安装nginx1.21.6开源软件

下载地址 http://nginx.org/download/nginx-1.21.6.tar.gz 通过网盘分享的文件:Nginx1.21.6 链接: https://pan.baidu.com/s/1tcsTs2IEmN80wt5VQ5U3PA?pwd=sky1 提取码: sky1 Xftp 传输安装包解压缩安装包 tar zxvf nginx-1.21.6进入到 nginx文件夹查看需要的依赖 ./configur…

C# 内嵌数据库 SQLite

最近,看到一个软件,软件是使用的内嵌数据库。我对这个东西没有实践过,今天突然想亲手做一做!。关于SQLIte的资料我就不多说了,网上都有。我自己也整理了一部分,基本上可以对SQLite有个全面的了解了。我这里就不废话了,直接上我自己的代码。 1:首先要先下载一个SQLite的…

Rust远程加载shellcode

学习rust, 练习写一个loader, 不足之处还请指教编写 隐藏黑框 在注释掉所有打印语句后编译运行还是会弹黑框, 解决方法是头部添加一行(指定 Rust 编译器生成的可执行文件为 Windows 子系统应用程序,而不是控制台应用程序): #![windows_subsystem = "windows"]‍ 反…

RustLoader

学习rust, 练习写一个loader, 不足之处还请指教编写 隐藏黑框 在注释掉所有打印语句后编译运行还是会弹黑框, 解决方法是头部添加一行(指定 Rust 编译器生成的可执行文件为 Windows 子系统应用程序,而不是控制台应用程序): #![windows_subsystem = "windows"]‍ 反…

机房轶事_2

机房轶事_2 之前 机房某同学的Luogu账号被另一个同学破解了密码,并且把头像改成了遗照(配花环)。 更过分的是,他居然将封面改成了教练的照片。

20241403《计算机基础与程序设计》课程总结

20241403《计算机基础与程序设计》课程总结 每周作业链接汇总 第一周作业: 【内容概要】课程概论第二周作业: 【内容概要】①数字化 ②信息安全 ③自学教材第三周作业: 【内容概要】①掌握门和电路 ②学习计算机部件 ③了解冯诺依曼体系结构 ④学习C语言基础知识,第四周作业…

AutoGeaconC2:一款一键读取Profile自动化生成geacon实现跨平台上线CobaltStrike

CobaltStrike是渗透测试中常用的一款基于C2框架的攻击工具。生成Windows payload也很方便。 但在CobaltStrike中如何上线Linux设备呢❓ AutoGeaconC2是一款一键读取Profile自动化生成geacon实现跨平台上线CobaltStrike。目前仅支持Linux amd64上线。 使用 首先下载releases中的…

Nginx-克隆备份虚拟机

克隆备份虚拟机 选中要备份的虚拟机 - 管理 - 克隆 开机状态下 没有办法克隆关机 init 0下一页克隆当前状态选择 创建链接克隆克隆名称 位置完成克隆

activiti6.0.0 二次开发兼容达梦数据库(亲测有效)

一、 前因 最近公司做数据库国产化,数据从MySql数据库中迁移到达梦(DM8),在迁移过程中,当迁移工作流(Activiti6.0.0)时,提换达梦(DM8)数据库驱动后启动过程报错: Caused by: org.activiti.engine.ActivitiException: couldnt deduct database type from database pr…