当前位置:   article > 正文

【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)_assetbundle文件用什么打开

assetbundle文件用什么打开

需要源码及依赖请点赞关注收藏后评论区留言私信~~~

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文件夹中 代码如下

  1. using System.Collections.Generic;
  2. using System.IO;
  3. using UnityEditor;
  4. public class PackBundles : Editor
  5. {
  6. //选定资源打包
  7. [MenuItem("PackBundles/PackBundles")]
  8. static void PutBundleAssetes()
  9. {
  10. //初始化一个AssetBundleBuild表
  11. List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>();
  12. AssetBundleBuild build = new AssetBundleBuild();
  13. //设置AssetBundleBuild的名字和资源路径
  14. build.assetBundleName = "tempImg.unity3d";
  15. build.assetNames = new[] { "Assets/Textures/tempImg.jpg" };
  16. //添加进表
  17. buildMap.Add(build);
  18. //将这些资源包放在一个名为ABs的目录下
  19. string assetBundleDirectory = "Assets/ABs";
  20. //如果目录不存在,就创建一个目录
  21. if (!Directory.Exists(assetBundleDirectory))
  22. {
  23. Directory.CreateDirectory(assetBundleDirectory);
  24. }
  25. //资源打包
  26. BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
  27. }
  28. }

全部资源打包

进行全部资源打包前需要先设置每个需要打包的资源的属性 然后我们修改PackBundles.cs脚本 实现添加选定资源打包盒全部资源打包功能

  1. using System.Collections.Generic;
  2. using System.IO;
  3. using UnityEditor;
  4. public class PackBundles : Editor
  5. {
  6. //选定资源打包
  7. [MenuItem("PackBundles/PackBundles")]
  8. static void PutBundleAssetes()
  9. {
  10. //初始化一个AssetBundleBuild表
  11. List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>();
  12. AssetBundleBuild build = new AssetBundleBuild();
  13. //设置AssetBundleBuild的名字和资源路径
  14. build.assetBundleName = "tempImg.unity3d";
  15. build.assetNames = new[] { "Assets/Textures/tempImg.jpg" };
  16. //添加进表
  17. buildMap.Add(build);
  18. //将这些资源包放在一个名为ABs的目录下
  19. string assetBundleDirectory = "Assets/ABs";
  20. //如果目录不存在,就创建一个目录
  21. if (!Directory.Exists(assetBundleDirectory))
  22. {
  23. Directory.CreateDirectory(assetBundleDirectory);
  24. }
  25. //资源打包
  26. BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
  27. }
  28. //全部打包
  29. [MenuItem("PackBundles/AllPackBundles")]
  30. static void PutBundleAssetesAll()
  31. {
  32. //将这些资源包放在一个名为ABs的目录下
  33. string assetBundleDirectory = "Assets/ABs";
  34. //如果目录不存在,就创建一个目录
  35. if (!Directory.Exists(assetBundleDirectory))
  36. {
  37. Directory.CreateDirectory(assetBundleDirectory);
  38. }
  39. BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
  40. }
  41. }

在菜单栏中选择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文件

  1. using System.Collections;
  2. using UnityEngine;
  3. using UnityEngine.Networking;
  4. public class LoadBundles : MonoBehaviour
  5. {
  6. void Start()
  7. {
  8. StartCoroutine(Load());
  9. }
  10. IEnumerator Load()
  11. {
  12. //从远程服务器上进行下载和加载
  13. string url = "http://localhost:8090/cube.unity3d";
  14. UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
  15. //等待文件下载完毕
  16. yield return request.SendWebRequest();
  17. AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
  18. //加载AssetBundle资源
  19. AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject));
  20. //根据资源生成文件
  21. Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
  22. yield return ABrequest;
  23. //释放资源
  24. request.Dispose();
  25. }
  26. }

 5:AssetBundle卸载

AssetBundle的卸载方式同样有四种 新建测试脚本代码如下

  1. using System.Collections;
  2. using UnityEngine;
  3. using UnityEngine.Networking;
  4. public class LoadBundles : MonoBehaviour
  5. {
  6. void Start()
  7. {
  8. StartCoroutine(Load());
  9. }
  10. IEnumerator Load()
  11. {
  12. //从远程服务器上进行下载和加载
  13. string url = "http://localhost:8090/cube.unity3d";
  14. UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
  15. //等待文件下载完毕
  16. yield return request.SendWebRequest();
  17. AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
  18. //加载AssetBundle资源
  19. AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject));
  20. //根据资源生成文件
  21. GameObject go = Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
  22. yield return ABrequest;
  23. //释放资源
  24. request.Dispose();
  25. //卸载资源 包含所有Load创建出来的对象
  26. bundle.Unload(true);
  27. //卸载资源 除了Load创建出来的对象
  28. bundle.Unload(false);
  29. //释放已加载的资源Object
  30. Resources.UnloadAsset(go);
  31. //卸载所有没有被场景引用的资源对象
  32. Resources.UnloadUnusedAssets();
  33. }
  34. }

6:AssetBundle打包工具

我们可以使用Unity AssetBundle Browser Tool插件 来查看AssetBundle 帮助打包AssetBundle和查看AssetBundle内容

创作不易 觉得有帮助请点赞关注收藏~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/82308
推荐阅读
相关标签
  

闽ICP备14008679号