首页 > 其他分享 >Unity中常用的数据存储方式

Unity中常用的数据存储方式

时间:2025-01-04 18:35:15浏览次数:1  
标签:aes 存储 string 常用 class Unity using public

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 易用性高,适合关卡或配置文件。

标签:aes,存储,string,常用,class,Unity,using,public
From: https://www.cnblogs.com/xiins/p/18652246

相关文章

  • Verilog语法之常用行为级语法
    摘要:本文主要介绍了一些在verilog中的行为级语法,并且提供了大量的运行实际例子,可以通过这些例子感受行为级语法在仿真中的巨大作用。概述:行为级语法是RTL级的上一层,或者说是比RTL级更高级的语法,其语法更加符合人类思维的描述方式。行为级语法可用于快速验证算法的正确性,或快......
  • 【工业行业】10种常用的工业通信协议特点及应用场景
    一、modbus通讯协议特点:开放标准,不依赖于特定制造商可以使用RS232、RS485或TCP/IP。简单,易容实现应用场景:广泛用于各种工业应用,如PLC、传感器、执行器等二、PROFIbus通讯协议特点:基于循环的通信,提供分层的通讯模型,支持诊断和网络配置功能应用场景:广泛用于工厂自动化、过程控......
  • docker常用命令大集结
    docker常用命令大集结ddocker常用命令大集结 Docker在不同操作系统上的安装步骤Windows:在Docker官网下载DockerDesktop进行安装MacOS:在Docker官网下载DockerDesktop进行安装Linux:通过包管理器(如apt,yum等)安装DockerDocker的版本检查使用dockervers......
  • 搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档
    搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档,可以遵循以下步骤和考虑因素:一、系统规划与设计需求分析:明确系统需要支持的功能,如文档上传、下载、编辑、共享、权限管理、版本控制等。确定用户群体和规模,以便选择合适的服务器和数据库。技术选型:......
  • linux命令行连接Postgresql常用命令
    1.linux系统命令行连接数据库命令psql-hhostname-pport-Uusername-ddatabasename-h 主机名或IP地址  -p 端口  -U 用户名  -d 连接的数据库2.查询数据库表命令selectversion()  #查看版本号\dg     #查看用户\l       #查......
  • Stable Diffusion 常用模型下载与说明(保姆级)
    相比于Midjourney,StableDiffusion最大的优势就是开源。相比于Midjourney靠开发人员开发的少数模型,SD则每时每刻都有人在世界各地训练自己的模型并免费公开共享给全世界的使用者。(当然你可以通过训练自己的专有模型而专门用于某一用途,这也将成为你作为AI绘画者的最重要的核......
  • 【从零开始入门unity游戏开发之——unity篇04】unity6基础入门——场景窗口(Scene)和层
    文章目录场景窗口(Scene)和层级窗口(Hierarchy)一、层级窗口(`Hierarchy`)1、添加新的对象(物体)2、`Hierarchy`层级窗口快捷键3、搜索二、Scene场景窗口1、工具栏控制台2、操作物体位置角度和缩放工具栏(1)平移(2)移动(3)旋转(4)缩放(5)矩形工具(6)综合(7)编辑碰撞体积3、窗口上方工具条内......
  • Arthas IDE 插件最全教程:服务器端安装、IntelliJ 配置、方法变量调试与常用命令详解
    言简意赅的讲解ArthasIDE插件解决的痛点之前给大家讲解了使用Arthas与EclipseMemoryAnalyzer的完整指南,但是很多同学觉得Arthas部分还不够细。以下内容将详细讲解ArthasIDE插件的使用方法,包括服务器端安装Arthas、IntelliJIDEA插件安装与配置、如何观察方法变......
  • 读数据保护:工作负载的可恢复性25公用云存储
    1. 对象存储1.1. 对象存储可能是未来比较适合长期保存备份与档案的一种技术1.2. 它的核心功能本身就已经含有保护数据所需的一些特性1.3. 对象存储系统里的所有数据都能自动复制到多个地点,这意味着它天生就符合3-2-1原则1.4. 对象存储还可以应对磁退化的问题,这是我们在......
  • 分解更深的存储器配置,实现功耗与性能平衡
    分解更深的存储器配置,实现功耗与性能平衡在使用更深的存储器配置工作时,您可以在RTL中使用RAM_DECOMP综合属性,通过提升内存组成来降低功耗。当RAM_DECOMP属性被应用到存储器阵列上时,存储器逻辑会被映射到更宽的块RAM原语阵列上。为平衡功耗与性能,您......