当前位置: 首页 > news >正文

【Unity3D】AB包加密(AssetBundle加密)

加密前:

加密后,直接无法加载ab,所以无法正常看到ab内容。

using UnityEngine;
using UnityEditor;
using System.IO;
public static class AssetBundleDemoTest
{[MenuItem("Tools/打包!")]public static void Build(){//注意:StreamingAssets文件夹需手动创建//参数:打包路径(Assets/StreamingAssets文件夹)、打包方式、打包平台(运行平台)BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression,EditorUserBuildSettings.activeBuildTarget);//刷新编辑器AssetDatabase.Refresh();}[MenuItem("Tools/加密AB")]public static void EncryptAB(){string[] filePaths = Directory.GetFiles(Application.dataPath + "/StreamingAssets");foreach (string filePath in filePaths){byte[] bytes = File.ReadAllBytes(filePath);byte[] newBytes = new byte[bytes.Length + 8];for (int i = 0; i < bytes.Length; i++){newBytes[8 + i] = bytes[i];}File.WriteAllBytes(filePath, newBytes);}}
}

测试代码如下,加载名为"prefab_ab"的AB包,并加载名为"Cube"的资源,是一个预制体。

关于资源加载详情:【Unity】资源加载方式大全_streamingassets manifest-CSDN博客

利用public static AssetBundle LoadFromFile(string path, uint crc, ulong offset);API从磁盘加载AB包,其中crc填0,代表没有任何CRC校验,offset填加密所使用的偏移量8(你可以改,但一定和加密时偏移量一样。) 

using System.Collections.Generic;
using UnityEngine;public class AssetBundleTest : MonoBehaviour
{Dictionary<string, GameObject> resourcesDict = new Dictionary<string, GameObject>();void Start(){GameObject goPrefab = LoadResourceByResourceNameFromAb("prefab_ab", "Cube");if (goPrefab != null){GameObject go = GameObject.Instantiate(goPrefab);}}private GameObject LoadResourceByResourceNameFromAb(string abName, string resourceName){if (!resourcesDict.ContainsKey(abName + "|" + resourceName)){//加载ab包 本地加载方式 一个名为apple的ab包文件AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + abName, 0, 8);if (assetBundle != null){//加载源资源时先加载依赖资源//1.加载位于StreamingAssets目录下的StreamingAssets包AssetBundle streamingAssetsBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/StreamingAssets", 0, 8);if (streamingAssetsBundle == null){Debug.Log("streamingAssetsBundle is not exist!");return null;}//加载StreamingAssets包下的AssetBundleManifest文件(可打开StreamingAssets.manifest文件看第三行的名字就是它)AssetBundleManifest assetBundleManifest = streamingAssetsBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//获取abName包的全部依赖名称!即StreamingAssets.manifest文件的指定Info为abName的Dependencies的数组内容string[] deps = assetBundleManifest.GetAllDependencies(abName);//加载abName包的全部依赖资源for (int i = 0; i < deps.Length; i++){//Debug.Log("依赖资源名称" + deps[i]);//因为依赖名称是一个相对路径,例如:StreamingAssets下的pp文件夹的m2资源是写为 pp/m2,所以加载是没问题AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + deps[i], 0, 8);}//加载源资源GameObject go = assetBundle.LoadAsset<GameObject>(resourceName);if (go != null){resourcesDict.Add(abName + "|" + resourceName, go);return go;}else{Debug.LogWarning("abNmae:" + abName + ",resourceName:" + resourceName + " is not exist!");return null;}}else{Debug.LogWarning("abNmae:" + abName + " is not exist!");return null;}}else{GameObject go = null;resourcesDict.TryGetValue(abName + "|" + resourceName, out go);return go;}}
}
http://www.lryc.cn/news/517052.html

相关文章:

  • 【FTP 协议】FTP主动模式
  • 十五、Vue 响应接口
  • 至强6搭配美光CZ122,证明CXL可以提高生成式AI的性能表现
  • 一文理解ssh,ssl协议以及应用
  • 电子应用设计方案87:智能AI收纳箱系统设计
  • BloombergGPT: A Large Language Model for Finance——面向金融领域的大语言模型
  • LeetCode - #180 Swift 实现连续数字查询
  • 为什么ip属地一会河南一会江苏
  • 使用最广泛的FastAPI项目结构推荐,命名规范等
  • [大模型开源]SecGPT 网络安全大模型
  • android 启动页倒计时页面编写
  • nuxt3路由及路由拦截
  • git版本管理
  • 382M 雨晨 19045.5247 Win10PE 网络版
  • 在二维数组中列优先存放是怎么进行的
  • Unity【Colliders碰撞器】和【Rigibody刚体】的应用——小球反弹效果
  • CES 2025:ROG打造极致游戏体验
  • 英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望
  • Windows 11 上配置VSCode 使用 Git 和 SSH 完整步骤
  • [读书日志]从零开始学习Chisel 第二篇:Scala的变量与函数(敏捷硬件开发语言Chisel与数字系统设计)
  • Unity:删除注册表内的项目记录
  • 【记录】东南大学研究生24-25秋季 学位英语考试
  • LabVIEW四边形阻抗继电器
  • 计算机网络(第8版)第3章课后习题--透明传输
  • 极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现
  • Hbuilder ios 离线打包sdk版本4.36,HbuilderX 4.36生成打包资源 问题记录
  • 实验四 数组和函数
  • 基于安卓14 的ANR dump信息原理
  • C++ volatile(八股总结)
  • SQL从入门到实战