AssetBundle包的加密

本文详细介绍了在Unity中如何通过自定义加密码实现资源AssetBundle包的加密与解密过程,包括构建AB包、加密AB包数据并重新写入,以及在加载时解密和使用AssetBundle.LoadFromMemoryAsync进行资源读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

1.先把资源构建成AssetBundle包

2.将构建出来的AB包数据读取出来进行加密,然后重新写入AB包

3.先解密,然后加载AB包

加密与解密

1.这里我们首先设定一个加密码,然后将读取出来的文件流的每一位与加密码进行异或操作得到一个新的加密过的数据,解密也是一样的操作

public class FileTools
{
    public const byte Key = 150; //加密码,自定义

    /// <summary>
    /// 加密/解密
    /// </summary>
    /// <param name="data"></param>
    public static void Encrypt(ref byte[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            data[i] = (byte)(data[i] ^ Key); //每一位与加密码进行异或操作
        }
    }
}

 

构建AB包

1.先把资源AB包名和后缀名设定好

2.然后在Editor目录下新建个脚本,进行编辑器扩展

3.输出路径使用AB包需要放置的路径

  [MenuItem("Component/构建AB包")]
   public static void BuildBundle()
    {
          BuildPipeline.BuildAssetBundles(AssetData.AssetBundleOutPutPath, BuildAssetBundleOptions.None,BuildTarget.Android);
    }

4.构建完成后,加密

   [MenuItem("Component/加密AB包")]
    public static void EncryptAssetBundle()
    {
        string[] abs = GetAllFiles(AssetData.AssetBundleOutPutPath, ".unity3d");

        foreach (var item in abs)
        {
            byte[] data= File.ReadAllBytes(item); //把ab包数据读取出来
            FileTools.Encrypt(ref data);   //加密
            File.WriteAllBytes(item, data); //加密后的数据重新写入包体
        }

    }

    // 获取路径下所有后缀名为 endName 的文件名
    public static string[] GetAllFiles(string path,string endName)
    {
        return Directory.GetFiles(path,"*"+endName,SearchOption.AllDirectories);
    }

注意:不了解编辑器扩展的同学可以先去了解下编辑器扩展

加载

1.加载先把ab包数据读出来,然后使用AssetBundle.LoadFromMemoryAsync或者AssetBundle.LoadFromMemory去读取

 //这里传入的abs是所有ab包的路径
 IEnumerator StartLoad(string[] abs)
    {
        foreach (string path in abs)
        {
           byte[] data=File.ReadAllBytes(path);
           FileTools.Encrypt(ref data); //解密
           AssetBundleCreateRequest asset=AssetBundle.LoadFromMemoryAsync(data);

           yield return asset;

           while (!asset.isDone)
           {
                Debug.Log(path + "进度" + asset.progress);
                yield return 0;
           }
            AssetBundleRequest bundleRequest= asset.assetBundle.LoadAllAssetsAsync();
            yield return bundleRequest;

            while (!bundleRequest.isDone)
            {
                yield return 0;
            }
            UnityEngine.Object[] res = bundleRequest.allAssets;

            for (int i = 0; i < res.Length; i++)
            {
                string key = res[i].name;
                Debug.Log("加载资源" + key + "完成");
                if (!mResDic.ContainsKey(key))
                {
                    mResDic.Add(key, res[i]); //缓存
                }
            }    
    
        }
   
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值