首页 > 其他分享 >Unity游戏框架设计之存档管理器

Unity游戏框架设计之存档管理器

时间:2024-05-01 18:11:05浏览次数:26  
标签:aes 管理器 string filePath 存档 Unity using byte

Unity游戏框架设计之存档管理器

存档管理器的主要功能是实现游戏进度的查询、存储(存档)、读取(读档)和删除(删档)。

存档主要有三种实现方案。

(一)PlayerPrefs。PlayerPrefs 类用于在游戏中存储、删除、修改和访问玩家的数据。存储的数据是持久化的,即使玩家关闭游戏或重新启动设备,数据也会保留下来。缺陷:PlayerPrefs 是明文存储的。

(二)本地存储:JSON + 加密算法。对于存档操作,先将玩家需要保存的数据封装为实体类,然后通过 JSON 工具将实体类序列化为 JSON 字符串,然后通过加密算法对 JSON 字符串进行加密,保证存档的安全,最后以二进制的方式输出到本地文件中。对于读档操作,则先读取本地二进制文件,然后通过加密算法解密出 JSON 字符串,然后通过 JSON 工具将 JSON 字符串反序列化为实体类即可。

(三)数据库存储。玩家数据将被存储到远程数据库中。玩家在游戏中不断与服务器交互,由服务器来完成游戏业务逻辑的处理,并在数据库中读取和修改玩家数据。

下述代码实现方案二下的存档管理器。

代码设计

public class GameProgressManager : SingletonMono<GameProgressManager>
{
    [Serializable]
    public abstract class GameProgressData
    {
    }

    private static readonly (byte[], byte[]) AesKeyAndIv = new(
        Convert.FromBase64String(""), Convert.FromBase64String("")
    );

    public void CreateGameProgress<T>(T data, string filePath) where T : GameProgressData
    {
        string gameProcessDataJson = JsonUtility.ToJson(data);
        byte[] encryptedData = EncryptStringByAes(gameProcessDataJson, AesKeyAndIv.Item1, AesKeyAndIv.Item2);
        File.WriteAllBytes(filePath, encryptedData);
    }

    public void RemoveGameProgress(string filePath)
    {
        if (File.Exists(filePath))
        {
            File.Delete(filePath);
        }
    }

    public void SaveGameProgress<T>(T data, string filePath) where T : GameProgressData
    {
        string gameProcessDataJson = JsonUtility.ToJson(data);
        byte[] encryptedData = EncryptStringByAes(gameProcessDataJson, AesKeyAndIv.Item1, AesKeyAndIv.Item2);
        File.WriteAllBytes(filePath, encryptedData);
    }

    public bool ContainGameProgress(string filePath)
    {
        return File.Exists(filePath);
    }

    public T GetGameProgress<T>(string filePath) where T : GameProgressData
    {
        byte[] encryptedData = File.ReadAllBytes(filePath);
        string gameProcessDataJson = DecryptStringByAes(encryptedData, AesKeyAndIv.Item1, AesKeyAndIv.Item2);
        return JsonUtility.FromJson<T>(gameProcessDataJson);
    }

    private static byte[] EncryptStringByAes(string plainText, byte[] key, byte[] iv)
    {
        using Aes aes = Aes.Create();
        aes.Key = key;
        aes.IV = iv;
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
        using MemoryStream memoryStream = new MemoryStream();
        using CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        byte[] plaintextBytes = Encoding.UTF8.GetBytes(plainText);
        cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length);
        cryptoStream.FlushFinalBlock();
        return memoryStream.ToArray();
    }

    private static string DecryptStringByAes(byte[] cipherText, byte[] key, byte[] iv)
    {
        using Aes aes = Aes.Create();
        aes.Key = key;
        aes.IV = iv;
        ICryptoTransform cryptoTransform = aes.CreateDecryptor(aes.Key, aes.IV);
        using MemoryStream memoryStream = new MemoryStream(cipherText);
        using CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Read);
        using StreamReader streamReader = new StreamReader(cryptoStream);
        return streamReader.ReadToEnd();
    }

    private static (byte[], byte[]) GenerateAesKeyAndIv()
    {
        using Aes aes = Aes.Create();
        aes.GenerateKey();
        aes.GenerateIV();
        Debug.Log("AES 密钥 " + Convert.ToBase64String(aes.Key));
        Debug.Log("AES 向量 " + Convert.ToBase64String(aes.IV));
        return (aes.Key, aes.IV);
    }
}

代码说明

(一)使用前需要先生成 AES 密钥和 AES 向量。

(二)所有游戏存档实体类必须继承 GameProgressData 类。

(三)游戏存档实体类中的内部类必须使用 [Serializable] 特性。

后记

由于个人能力有限,文中不免存在疏漏之处,恳求大家斧正,一起交流,共同进步。

标签:aes,管理器,string,filePath,存档,Unity,using,byte
From: https://www.cnblogs.com/kkelin/p/18169508

相关文章

  • Unity2D横版游戏之平台跳跃效果
    Unity2D横版游戏之平台跳跃效果简单介绍平台跳跃效果。玩家允许在平台下方跳跃到平台上方,并且可以在平台上方站立,同时玩家在平台上方允许通过下跳操作到达平台下方。实现步骤(一)将玩家的图片设置为Player、将平台的图层设置为Platform。(二)为平台游戏对象创建XXXCollider2D......
  • Unity2D横板游戏之背景视差与无限滚动效果
    Unity2D横板游戏之背景视差与无限滚动效果简单介绍背景视差效果。在2D横板游戏中,由若干个背景图片构成的背景,在背景移动的过程中,每一个背景图片的移动速度均不同,靠近玩家的背景图片移动速度快,而远离玩家的背景图片移动速度慢,从而形成背景的视差效果,使背景更加立体且富有层级。......
  • Unity游戏框架设计之UI管理器
    Unity游戏框架设计之UI管理器简单介绍在游戏开发过程中,我们通常需要管理UI游戏对象的加载、打开和销毁等操作,同时也需要管理游戏数据和游戏数据在UI上的显示,因此我们需要一个UI管理器来统一实现上述基础功能。我们可以基于MVC模式编写UI管理器,此时UI管理器将分为模......
  • Unity游戏框架设计之缓存池管理器
    Unity游戏框架设计之缓存池管理器简单介绍在游戏运行的过程中,我们可能遇到这样的需求,即创建大量相同类型的敌人。在传统方法中,我们将对每一个敌人都重新创建,但这样是效率低且占据内存的。为此我们可以这样做,所有敌人在创建时,都从敌人缓存池中取出敌人对象,当敌人死亡时,则将敌人......
  • 密码管理器---KaPass v1.0.3
    伴随的网龄的增加,密码也随之增加,简单的密又怕不安全,复杂的密码怕记不住。就是在这样的情况下,KaPass密码管理器应运而生。一个密码管理器---KaPass,简洁的界面,功能齐全,一起了解一下KaPass: 1、登陆窗口2、主界面3、新增群组,可自定义群组图标4、新增密码,可以储存各式各样......
  • Unity游戏框架设计之音频管理器
    Unity游戏框架设计之音频管理器简单介绍在游戏中,主要的音频分为两种类型。第一种类型是BGM(背景音乐),第二种类型是音效。BGM的特点是音频持续时间长,一般在游戏中的同一时间内只能播放一个BGM。音效的特点是音频持续时间短,一般在游戏中的同一时间内允许同时播放多个音效。在下......
  • Unity性能分析(一)流程与工具的使用
    性能分析工作流对于游戏开发是“必备”的,从基本的三方面开始:在修改之前分析:建立基准线在开发过程中分析:确保修改不会影响性能在修改后分析:证明修改产生了预期效果分析工具是开发者的实用工具之一,可以帮助开发者定位代码中的内存问题和性能瓶颈,也能帮助了解Unity引擎底层的运......
  • Unity性能分析(二)CPU/GPU分析
    设置每帧时间预算帧率(fps)并不是衡量游戏稳定体验的理想指标。考虑以下情况:在运行时的前0.75s内渲染了59帧。然后接下来的1帧需要0.25s才能渲染完毕。虽然是60fps,但实际上会让玩家感觉卡顿。这是需要设置帧时间预算的重要原因之一。这为您提供了一个目标,在对游戏进行分析和优化时......
  • Unity性能分析(三)内存分析
    Unity中有两种分析内存的方法:MemoryProfiler:内置的分析器,提供内存使用的基本信息。MemoryProfilerpackage:将package添加到项目中,更详细地分析内存使用情况。可以存储和比较快照查找内存泄漏,查看内存布局以查找内存碎片问题。确定物理RAM限制每个目标平台都有一个内存限......
  • Unity性能分析(四)Unity性能分析工具使用
    使用Profiler按照以下步骤开始使用UnityProfiler:在进行分析时,必须使用开发版本。File>BuildSettings>DevelopmentBuild。勾选AutoconnectProfile(可选)。注意:AutoconnectProfile会增加初始启动时间。如果不启用AutoconnectProfiler,可以随时手动连接正在运行的开发版......