需要源码及依赖请点赞关注收藏后评论区留言私信~~~
AssetBundle最重要的操作就是AssetBundle打包 下载 加载以及卸载 下面就来了解一下AssetBundle的常用操作
1:AssetBundle打包
AssetBundle打包主要用到下面两个API
BuildAssetBundles(string outputPath,AssetBundleBuild[] builds,
BuildAssetBundleOptions assetBundleOptions,BuildTarget targetPlatform);
BuildAssetBundles(string outputPath,BuildAssetBundleOptions assetBundleOptions,BuildTatget targetPlarform);
下面新建一个PackBundles.cs脚本 放入Editor文件夹中 代码如下
using System.Collections.Generic; using System.IO; using UnityEditor; public class PackBundles : Editor { //选定资源打包 [MenuItem("PackBundles/PackBundles")] static void PutBundleAssetes() { //初始化一个AssetBundleBuild表 List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>(); AssetBundleBuild build = new AssetBundleBuild(); //设置AssetBundleBuild的名字和资源路径 build.assetBundleName = "tempImg.unity3d"; build.assetNames = new[] { "Assets/Textures/tempImg.jpg" }; //添加进表 buildMap.Add(build); //将这些资源包放在一个名为ABs的目录下 string assetBundleDirectory = "Assets/ABs"; //如果目录不存在,就创建一个目录 if (!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } //资源打包 BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }
全部资源打包
进行全部资源打包前需要先设置每个需要打包的资源的属性 然后我们修改PackBundles.cs脚本 实现添加选定资源打包盒全部资源打包功能
using System.Collections.Generic; using System.IO; using UnityEditor; public class PackBundles : Editor { //选定资源打包 [MenuItem("PackBundles/PackBundles")] static void PutBundleAssetes() { //初始化一个AssetBundleBuild表 List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>(); AssetBundleBuild build = new AssetBundleBuild(); //设置AssetBundleBuild的名字和资源路径 build.assetBundleName = "tempImg.unity3d"; build.assetNames = new[] { "Assets/Textures/tempImg.jpg" }; //添加进表 buildMap.Add(build); //将这些资源包放在一个名为ABs的目录下 string assetBundleDirectory = "Assets/ABs"; //如果目录不存在,就创建一个目录 if (!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } //资源打包 BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } //全部打包 [MenuItem("PackBundles/AllPackBundles")] static void PutBundleAssetesAll() { //将这些资源包放在一个名为ABs的目录下 string assetBundleDirectory = "Assets/ABs"; //如果目录不存在,就创建一个目录 if (!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } }
在菜单栏中选择PackBundles->AllPachBundles命令 可以在Project视图中看到ABs文件夹中生成的AssetBundle文件 可以看到打包出来的文件有一个特点,就是每个AssetBundle资源包都会有一个后缀名为.manifest的文件
2:Manifest文件
Manifest文件其实是AssetBundle资源文件的依赖关系以及对包的信息的记录文件,根据这个文件可以获取某个包的依赖关系,或者判断所获取包的大小,效验码是否是正常的 将这个文件使用文本编辑器打开后 可以看到文件内容
CRC: 效验码 通过其检查包是否完整
Assets:表示包里包含多少资源
Dependencies:表示包有哪些依赖
3:AssetBundle文件上传
接下来使用IIS搭建本地服务器
1:在Windows中打开如下界面
2:打开IIS 新建网站 设置网站名称 端口号以及物理路径 将物理路径设置为存放AssetBundle资源文件的路径
3:设置IIS属性
4:将生成的AssetBundle文件放入设置的物理路径的文件夹中 然后删除后缀名为.meta的文件
4:AssetBundle加载
AssetBundle的加载方式有以下四种
AssetBundle.LoadFromFile:从本地加载
AssetBundle.LoadFromMemory 从内存加载
WWW.LoadFromCacheOrDownload 加载后放在缓存备用
UnityWebRequest 从服务器加载
下面新建一个脚本用于加载AssetBundle文件
using System.Collections; using UnityEngine; using UnityEngine.Networking; public class LoadBundles : MonoBehaviour { void Start() { StartCoroutine(Load()); } IEnumerator Load() { //从远程服务器上进行下载和加载 string url = "http://localhost:8090/cube.unity3d"; UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); //等待文件下载完毕 yield return request.SendWebRequest(); AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request); //加载AssetBundle资源 AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject)); //根据资源生成文件 Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity); yield return ABrequest; //释放资源 request.Dispose(); } }
5:AssetBundle卸载
AssetBundle的卸载方式同样有四种 新建测试脚本代码如下
using System.Collections; using UnityEngine; using UnityEngine.Networking; public class LoadBundles : MonoBehaviour { void Start() { StartCoroutine(Load()); } IEnumerator Load() { //从远程服务器上进行下载和加载 string url = "http://localhost:8090/cube.unity3d"; UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); //等待文件下载完毕 yield return request.SendWebRequest(); AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request); //加载AssetBundle资源 AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject)); //根据资源生成文件 GameObject go = Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity); yield return ABrequest; //释放资源 request.Dispose(); //卸载资源 包含所有Load创建出来的对象 bundle.Unload(true); //卸载资源 除了Load创建出来的对象 bundle.Unload(false); //释放已加载的资源Object Resources.UnloadAsset(go); //卸载所有没有被场景引用的资源对象 Resources.UnloadUnusedAssets(); } }
6:AssetBundle打包工具
我们可以使用Unity AssetBundle Browser Tool插件 来查看AssetBundle 帮助打包AssetBundle和查看AssetBundle内容
创作不易 觉得有帮助请点赞关注收藏~~~