Unity Addressables加密

博主分享了在Unity中使用AddressablesCN进行资源加密加载的体验,详细介绍了配置步骤,并提醒注意所有Group需统一加密方式。然而,在实际使用中发现启动时存在明显卡顿和大量GC问题,最终选择回到原版Addressables。

卧槽,今天一打开Package Manager我发现了什么?!!!

image.png

我的天呐,等了这么久终于出了!居然单独出了一个AddressablesCN用于加密,简直太贴心了。
此处感动地留下了泪水,幸好项目还没发布,分分钟转过来。

本贴就是感慨一下,顺带召唤小伙伴们,快去用AddressablesCN啊,简单易用,有了加密功能简直无懈可击~

附带官方使用说明地址:https://ucgbucket.unitychina.cn/AssetStreaming/AddressablesCN.pdf

这里简述一下使用方法:
1.创建Group

image.png

2.如果要设置自己的密钥:在工程里新建一个脚本,脚本内容如下,命名你们随意,设置一下密钥,注意密钥需要16位,正常ASCII码均可,也就是普通数字大小写字母都行

using System.IO;
using System.Security.Cryptography;
namespace UnityEngine.ResourceManagement.ResourceProviders
{
    public class MyAESStreamProcessor : IDataConverter
    {
        byte[] Key
        {
            get
            {
                return
System.Text.Encoding.ASCII.GetBytes("ABCDEFGHIJKLMNOP");//修改此处密钥,需要16位,正常ASCII码均可
            }
        }
        SymmetricAlgorithm m_algorithm;
        SymmetricAlgorithm Algorithm
        {
            get
            {
                if (m_algorithm == null)
                {
                    m_algorithm = new AesManaged();
                    m_algorithm.Padding = PaddingMode.Zeros;
                    var initVector = new byte[m_algorithm.BlockSize / 8];
                    for (int i = 0; i < initVector.Length; i++)
                        initVector[i] = (byte)i;
                    m_algorithm.IV = initVector;
                    m_algorithm.Key = Key;
                    m_algorithm.Mode = CipherMode.ECB;
                }
                return m_algorithm;
            }
        }

        public Stream CreateReadStream(Stream input, string id)
        {
            return new CryptoStream(input,
            Algorithm.CreateDecryptor(Algorithm.Key, Algorithm.IV),
            CryptoStreamMode.Read);
        }

        public Stream CreateWriteStream(Stream input, string id)
        {
            return new CryptoStream(input,
            Algorithm.CreateEncryptor(Algorithm.Key, Algorithm.IV),
            CryptoStreamMode.Write);
        }
    }
}

3.Group上的高级设置选一下加密方式

image.png

用起来真简单,给AddressablesCN点赞~


在实际项目使用中发现他会报错,然后加载半天后Addressables报空物体,排查了一下,发现所有的Group都得选同一个加密方式,尤其是默认的Group别忘了选~


2020.1.29更新
好吧我又回来了,我收回以上的赞扬。
实际使用的时候发现AddressablesCN会在启动程序的时候卡顿很久,造成了大量的GC

image.png

默默换回了Addressables。。。

Unity 使用 Addressables 打包资源时,官方并没有直接提供资源加密的功能,但可以通过以下几种方式实现加密逻辑: ### 1. 自定义资源加密与解密流程 可以在打包 Addressables 资源之前,对原始资源文件进行加密,然后在运行时加载时进行解密。具体步骤如下: - **加密阶段**:在构建 Addressables 包时,通过自定义脚本对资源进行加密,例如使用 AES 或其他加密算法处理资源文件。 - **解密阶段**:在运行时加载资源时,通过 `IAssetBundleResource` 或自定义的 `IDataProvider` 实现解密逻辑,确保资源在加载时能正确解密并使用[^4]。 ### 2. 使用自定义 `IDataProvider` Addressables 系统允许通过实现 `IDataProvider` 接口来控制数据的加载过程。可以利用这一点,在数据加载时加入解密逻辑: ```csharp public class EncryptedBinaryDataProvider : IDataProvider { private readonly IDataProvider _defaultProvider; public EncryptedBinaryDataProvider(IDataProvider defaultProvider) { _defaultProvider = defaultProvider; } public async UniTask<object> ProvideDataStreamAsync(IResourceLocation location, IResourceProvider provider, IAsyncOperation operation, Type desiredType) { var encryptedData = await _defaultProvider.ProvideDataStreamAsync(location, provider, operation, typeof(byte[])); byte[] decryptedData = Decrypt((byte[])encryptedData); // 自定义解密方法 return decryptedData; } private byte[] Decrypt(byte[] data) { // 实现具体的解密逻辑 return data; // 返回解密后的数据 } } ``` ### 3. 修改构建脚本加入加密逻辑 可以通过修改 Addressables 的构建脚本,在构建过程中对资源进行加密Unity 提供了 `Addressables.BuildScriptPackedMode` 类,可以继承并重写 `WriteBundledAssets` 方法,在写入资源之前对其进行加密处理[^1]。 ```csharp public class CustomBuildScript : Addressables.BuildScriptPackedMode { protected override void WriteBundledAssets(IList<AssetBundleBuild> builds, string outputFolder, string settingsHash) { foreach (var build in builds) { // 对 build 中的资源进行加密 } base.WriteBundledAssets(builds, outputFolder, settingsHash); } } ``` ### 4. 使用 StreamingAssets 的加密方案 如果资源最终会被部署到 `StreamingAssets` 目录,可以在打包时加密资源文件,并在运行时读取时解密。例如,使用 `UnityWebRequest` 加载加密的资源包,然后在内存中解密并加载: ```csharp IEnumerator LoadEncryptedAsset(string url) { UnityWebRequest request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if (request.isNetworkError || request.isHttpError) yield break; byte[] encryptedData = request.downloadHandler.data; byte[] decryptedData = Decrypt(encryptedData); // 自定义解密方法 AssetBundle bundle = AssetBundle.LoadFromMemory(decryptedData); // 加载资源... } private byte[] Decrypt(byte[] data) { // 实现具体的解密逻辑 return data; } ``` ### 5. 使用第三方加密库 可以借助第三方加密库(如 [AES Encryption](https://github.com/nevercode1/Unity-AES-Encryption))来简化加密和解密流程。这些库通常提供了完整的 Unity 集成方案,可以无缝嵌入到 Addressables 的构建和加载流程中。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值