AssetBundles

AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景)。AssetBundles可以表示彼此之间的依赖关系;例如AssetBundle A中的一个材质可以引用AssetBundle B中的一个纹理。为了通过网络进行有效的传递,可以根据用例要求,选择内置算法(LZMA和LZ4)来对AssetBundles进行压缩。
AssetBundles可用于可下载内容(DLC),减少初始安装大小,加载为最终用户平台优化的资产,并降低运行时内存压力。

一个AssetBundle文件中有什么?

好的问题,实际上“AssetBundle”可以指两个不同但有关的事情。

第一个是磁盘上的实际文件。我们把这叫做AssetBundle存档,或在本文档只是短期档案。存档可以被认为是一个容器,就像一个文件夹,在其中保存其他文件。这些附加文件包括两种类型:序列化文件和资源文件。序列化的文件将您的资产分成各自的对象,并写入这个文件。资源文件只是存储在某些资产(纹理和音频)中的二进制数据块,允许我们在另一个线程上有效地将其从磁盘加载到内存。

第二个是您通过代码从特定存档加载资源的实际的AssetBundle对象。此对象包含您添加到此存档的资源的所有文件路径的映射到属于该资产的对象,该对象在需要时需要加载。(This object contains a map of all the file paths of the assets you added to this archive to the objects that belong to that asset that need to be loaded when you ask for it.)

AssetBundle工作流程

要开始使用AssetBundles,请按照下列步骤操作。有关每个工作流程的更详细信息,请参见本部分文档中的其他页面。

将资产分配给AssetBundles

要将一个给定的资产分配给一个AssetBundle,请按照下列步骤操作:

  1. 从“项目视图”中选中要分配给一个bundle的资产
  2. 检查Inspector视图中的对象
  3. 在Inspector视图的底部,可以看到一个部分来分配AssetBundles和Variants
  4. 左侧的下拉菜单分配AssetBundle,而右侧的下拉菜单则指定Variants
  5. 点击左侧的下拉菜单,其中显示“None”以显示当前注册的AssetBundle名称
  6. 如果尚未创建,你将看到上面的图像中的列表
  7. 点击“New...”创建一个新的AssetBundle
  8. 键入所需的AssetBundle名称。请注意,AssetBundle名称支持一种类型的文件夹结构,具体取决于你键入的内容。要添加子文件夹,请使用“/”分隔文件夹名称。例如:AssetBundle名称“environment/forest”将在environment子文件夹下创建一个名为forest的bundle
  9. 一旦你选择或创建了一个AssetBundle名称,你可以重复此过程,为右侧下拉菜单分配或创建一个不同的名称,以分配或创建一个Variant名称,如果你愿意的话。在构建AssetBundles时,Variant名称不是必需的。

要了解有关AssetBundle分配和随附策略的更多信息,请参阅Preparing Assets for AssetBundles的文档。

构建AssetBundles

在项目中的Assets文件夹下创建一个名为Editor的文件夹,并在文件夹中放置以下内容的脚本:

using UnityEditor;public class CreateAssetBundles
{[MenuItem("Assets/Build AssetBundles")]static void BuildAllAssetBundles(){string assetBundleDirectory = "Assets/AssetBundles";if(!Directory.Exists(assetBundleDirectory){Directory.CreateDirectory(assetBundleDirectory);}BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.Standalone);}
}

该脚本将在Assets菜单的底部创建一个名为“Build AssetBundles”的菜单项,该菜单项将执行与该标记关联的功能中的代码。当您单击Build AssetBundles时,进度条将显示一个构建对话框。这将使那些用AssetBundle名称标记的所有资产打包进同一个文件,并将它们放在由assetBundleDirectory定义的路径上的文件夹中。

有关此代码正在执行的更多详细信息,请参阅有关Building AssetBundles的文档。

上传AssetBundles到非本地存储

这一步对于每个用户都是独一无二的,而不是一步一步可以告诉你如何做。如果您打算将AssetBundles上传到第三方托管网站,请在此处进行。如果您正在严格执行本地开发,并打算将所有AssetBundles都放在磁盘上,请跳到下一步。

加载AssetBundles和Assets

对于有意从本地存储加载的用户,您将对AssetBundles.LoadFromFile API感兴趣。看起来像这样:

public class LoadFromFileExample extends MonoBehaviour {function Start() {var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));if (myLoadedAssetBundle == null) {Debug.Log("Failed to load AssetBundle!");return;}var prefab = myLoadedAssetBundle.LoadAsset.<GameObject>("MyObject");Instantiate(prefab);}
}

LoadFromFile获取包文件的路径。

如果您自己托管AssetBundles并且需要将其下载到游戏中,那么您将对UnityWebRequest API感兴趣。这里有一个例子:

IEnumerator InstantiateObject()
{string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.GetAssetBundle(uri, 0);yield return request.Send();AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);GameObject cube = bundle.LoadAsset<GameObject>("Cube");GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");Instantiate(cube);Instantiate(sprite);
}

GetAssetBundle(string, int)获取AssetBundle的位置的uri以及要下载的包的版本。在这个例子中,我们仍然指向一个本地文件,但是字符串uri可以指向你托管AssetBundles的任何URL。

UnityWebRequest具有处理AssetBundles的特定句柄(DownloadHandlerAssetBundle),DownloadHandlerAssetBundle从请求中获取AssetBundle。

无论使用的方法如何,你现在都可以访问AssetBundle对象。从该对象中加载资源,你将需要使用LoadAsset<T>(string)方法,该方法中泛型类型T表示你所要加载的Asset的类型,方法参数为所要加载的Asset对象的名称。这将返回您从AssetBundle加载的任何对象。您可以像Unity中的任何对象一样使用这些返回的对象。例如,如果要在场景中创建一个GameObject,则只需要调用Instantiate(gameObjectFromAssetBundle)。
有关加载AssetBundles的API的更多信息,请参阅Using AssetBundles Natively文档。

原文链接:

  1. AssetBundles
  2. AssetBundle Workflow

同系列文章

「翻译」Unity中的AssetBundle详解(一)

「翻译」Unity中的AssetBundle详解(二)

「翻译」Unity中的AssetBundle详解(三)

「翻译」Unity中的AssetBundle详解(四)


本文作者: Sheh伟伟
本文链接: http://davidsheh.github.io/2017/07/14/「翻译」Unity中的AssetBundle详解(一)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

转载于:https://www.cnblogs.com/davidsheh/p/7421615.html

「翻译」Unity中的AssetBundle详解(一)相关推荐

  1. Unity中AB包详解(超详细,特性,打包,加载,管理器)

    Unity中的AssetBundle详解 AssetBundle的概念 AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包. Unity中的AssetBundle系统是对 ...

  2. 计算机网络「二」—— 物理层(多图详解)

    本文自学计算机网络时所写笔记,网课为B站湖科大教书匠的 计算机网络微课堂.(强烈安利这个课程,讲课思路条理清晰,PPT美轮美奂.通俗易懂) 本文为第二章笔记,陆续会更新余下内容 计算机网络「一」计算机 ...

  3. 说走就走的「Windows」—— Windows To Go 制作详解

    拥有 Mac 的同学大概都会碰到一个头疼的问题,那就是使用 Windows 的使用需求.macOS 虽好,不过总是会有一些讨厌的软件没有 Mac 版本,这时就不得不在 Mac 上跑 Windows 了 ...

  4. wintogo论坛_说走就走的「Windows」—— Windows To Go 制作详解

    拥有 Mac 的同学大概都会碰到一个头疼的问题,那就是使用 Windows 的使用需求.macOS 虽好,不过总是会有一些讨厌的软件没有 Mac 版本,这时就不得不在 Mac 上跑 Windows 了 ...

  5. Unity中Light Probe详解

    本文节选自洪流学堂公众号专栏<郑洪智的Unity2018课>,未经允许不可转载. 洪流学堂公众号回复光照探头,获取本文对应的视频实战教程. 洪流学堂,让你快人几步.你好,我是郑洪智. Un ...

  6. 直播笔记 | Unity中射线检测详解

    本文首发于洪流学堂微信公众号. 洪流学堂,学Unity快人几步 你好,我是郑洪智,你的技术探路者. 这周三我们直播剖析了Unity中射线检测的功能,以下是直播内容精华部分笔记. 完整录播:https: ...

  7. unity中Input.Touch详解

    相关的api 1.Touch类:用来记录一个手指触摸在屏幕上的状态与位置的各种相关数据.这其它中只有两个属性是你要注意的,就是Touch.fingerId和Touch.tapCount. Touch. ...

  8. Unity中Time类详解

    一:前言 Unity中时间类 二:常用 --Time.time 从游戏开始后所运行的时间,会受时间缩放比例的影响 --Time.unscaledTime 从游戏开始后所运行的时间,不受时间缩放比例的影 ...

  9. 新手必备pr 2021快速入门教程「七」效果控件面板详解

    PR2021快速入门教程,学完之后,制作抖音视频,vlog,电影混剪,日常记录等不在话下!零基础,欢迎入坑! 本节内容 在使用pr软件的过程中,效果控件功能可以说是比较常用的功能,但是,具体它有哪些效 ...

最新文章

  1. Java学习总结:7
  2. String练习代码保存
  3. 【转载】Eclipse快捷键 10个最有用的快捷键
  4. .net反射调用值类型引用参数时的处理办法(转)
  5. ffmpeg转码文件输出rtsp流
  6. NC文件按时序维度拆分
  7. windows下ssh远程连接服务器
  8. 联想启天m410进bios_联想启天M410台式机重装系统win7-联想win7系统下载
  9. 1005打印任务取消不了 hp_HP打印机打印时任务打印不了时无法取消
  10. 冬训成果何在?林丹无缘新赛季首冠状态成迷
  11. js实现23种设计模式
  12. Raft 共识算法3-日志复制
  13. android 读取excel 文件
  14. 计算机学院教师老带新总结,教师以老带新个人工作总结范文(精选3篇)
  15. 实时操作系统 RTOS的任务调度器的理解
  16. 《被讨厌的勇气》- 要有被讨厌的勇气
  17. DDD实战课(实战篇)--学习笔记
  18. 驱动开发人员不足?经验不够?一招教你立即摆平!
  19. 线索二叉树,画图教你秒懂线索二叉树(线索二叉树的建立和简单操作)逻辑代码分析
  20. 【rmzt】XP主题下载

热门文章

  1. python gcm channel_python – 无法使用Django在GCM中发送POST请求
  2. AllJoyn核心应用教程【第四章】:Base Services服务之Onboarding
  3. sap测试IDOC include ZXTRKU02
  4. 参考文献里英文人名书写示例
  5. Dijkstra(邻接矩阵有向图)C 实现~
  6. 分析器错误消息: 未能加载类型“Automation.Web.MvcApplication”。
  7. 各进制转换的详细讲解
  8. android qq语音按钮,科技教程:如何在手机QQ中使用新版QQ语音进度条功能?
  9. 数据同步工具Canal
  10. Android ADB Shell命令大全