找回密码
 注册帐号

扫一扫,访问微社区

资源包常见问题

2015-1-8 16:51| 发布者: 杨炎| 查看: 3550| 评论: 0|原作者: 蛮牛|来自: unity3d脚本manual

摘要: 资源包常见问题什么是资源包 (assetbundles)?资源包 (assetbundles) 有何用途?如何创建资源包 (assetbundles)?如何使用资源包 (assetbundles)?如何在编辑器中使用资源包 (assetbundles)?如何缓存资源包 (assetb ...

资源包常见问题

什么是资源包 (assetbundles)?

资源包 (assetbundles) 有何用途?

如何创建资源包 (assetbundles)?

如何使用资源包 (assetbundles)?

如何在编辑器中使用资源包 (assetbundles)?

如何缓存资源包 (assetbundles)?

资源包 (assetbundles) 是否兼容多个平台?

如何查找资源包 (assetbundles) 中的资源

是否可在其他游戏中重复使用我的资源包 (assetbundles)?

现在构建的资源包 (assetbundles) 是否可用于将来版本的 unity?

如何列出资源包 (assetbundles) 中的对象

什么是资源包 (assetbundles)?

资源包 (assetbundles) 是在运行时为加载打包组成的资源集合。借助资源包 (assetbundles),可以为应用动态加载和卸载新内容。资源包 (assetbundles) 可用于实现发布后追加下载内容 (dlc)。

资源包 (assetbundles) 有何用途?

资源包用于在进行首次部署的情况下减少游戏占用的磁盘空间。也可用它将新内容添加至已发布的游戏。

如何创建资源包 (assetbundles)?

创建资源包 (assetbundle) 需要使用构建管线 (buildpipeline) 编辑器类。必须将使用编辑器 (editor) 类的所有脚本置于资源 (assets) 文件夹下以编辑器 (editor) 命名的文件夹中。以下是一个 c# 脚本示例:

+ show [creating an assetbundle] +

using unityengine;

using unityeditor;

public class exportassetbundles {

[menuitem("assets/build assetbundle")]

static void exportresource () {

string path = "assets/myassetbundle.unity3d";

object[] selection = selection.getfiltered(typeof(object), selectionmode.deepassets);

buildpipeline.buildassetbundle(selection.activeobject, selection, path, buildassetbundleoptions.collectdependencies | buildassetbundleoptions.completeassets);

}

}

}

编辑器 (editor) 脚本将由编辑器运行,无需运用到游戏对象 (gameobject)。上一示例将在名为构建资源包 (build assetbundle) 的编辑器资源 (assets) 菜单中新建一个项目。

要使用此示例:

在工程视图 (project view) 中以编辑器 (editor) 命名的文件夹中,创建一个 c# 脚本文件,并以 exportassetbundles.cs 命名。

在工程文件夹中选择一个或多个需要导入至资源包 (assetbundle) 的资源 (assets)。

在资源 (assets) 菜单中选择构建资源包 (build assetbundle)。单击保存 (save) 构建资源包 (assetbundle)。

exportresource 函数的第一行设置资源包 (assetbundle) 的导出路径。

第二行将导入至资源包 (assetbundle) 的选项设置为在工程 (project) 窗口中选择的对象。

buildassetbundle 函数所在的那一行用于在指定位置创建并保存资源包 (assetbundle)。第一个参数指定主资源 (mainasset),这是一种加载资源包 (assetbundle) 中的资源时直接使用主资源属性即可获取的一种特殊资源。主资源不是必须设置的项,如果无法使用该资源,您可将 null 用作参数。第二个参数是组成资源包 (assetbundle) 的对象数组。第三个参数是指资源包 (assetbundle) 在磁盘上的保存位置。最后一个参数是指构建资源包 (assetbundles) 时使用的构建标志或选项。位操作符 or ( | ) 将传递的选项合并起来构建资源包 (assetbundles)。在本示例中,它由 buildassetbundleoptions.collectdependencies 设置,以添加由对象引用的其他资源 (assets),buildassetbundleoptions.completeassets 确保资源完全导入。

构建资源包 (assetbundles) 是发布前的一个步骤,只执行一次,并只调用一个函数,例如,构建所有资源包 (assetbundles) 的菜单项 (menu item)。开发应用程序时应撰写 helper 脚本,只需单击一下或在无需用户干预的批处理模式下,即可为目标平台构建所有资源包 (assetbundles),

使用其他函数也可构建资源包 (assetbundles)。可在此处了解更多相关信息。

using unityengine;

using unityeditor;

public class exportassetbundles {

[menuitem("assets/build assetbundle")]

static void exportresource () {

string path = "assets/myassetbundle.unity3d";

object[] selection = selection.getfiltered(typeof(object), selectionmode.deepassets);

buildpipeline.buildassetbundle(selection.activeobject, selection, path, buildassetbundleoptions.collectdependencies | buildassetbundleoptions.completeassets);

}

}

}

编辑器 (editor) 脚本将由编辑器运行,无需运用到游戏对象 (gameobject)。上一示例将在名为构建资源包 (build assetbundle) 的编辑器资源 (assets) 菜单中新建一个项目。

要使用此示例:

在工程视图 (project view) 中以编辑器 (editor) 命名的文件夹中,创建一个 c# 脚本文件,并以 exportassetbundles.cs 命名。

在工程文件夹中选择一个或多个需要导入至资源包 (assetbundle) 的资源 (assets)。

在资源 (assets) 菜单中选择构建资源包 (build assetbundle)。单击保存 (save) 构建资源包 (assetbundle)。

exportresource 函数的第一行设置资源包 (assetbundle) 的导出路径。

第二行将导入至资源包 (assetbundle) 的选项设置为在工程 (project) 窗口中选择的对象。

buildassetbundle 函数所在的那一行用于在指定位置创建并保存资源包 (assetbundle)。第一个参数指定主资源 (mainasset),这是一种加载资源包 (assetbundle) 中的资源时直接使用主资源属性即可获取的一种特殊资源。主资源不是必须设置的项,如果无法使用该资源,您可将 null 用作参数。第二个参数是组成资源包 (assetbundle) 的对象数组。第三个参数是指资源包 (assetbundle) 在磁盘上的保存位置。最后一个参数是指构建资源包 (assetbundles) 时使用的构建标志或选项。位操作符 or ( | ) 将传递的选项合并起来构建资源包 (assetbundles)。在本示例中,它由 buildassetbundleoptions.collectdependencies 设置,以添加由对象引用的其他资源 (assets),buildassetbundleoptions.completeassets 确保资源完全导入。

构建资源包 (assetbundles) 是发布前的一个步骤,只执行一次,并只调用一个函数,例如,构建所有资源包 (assetbundles) 的菜单项 (menu item)。开发应用程序时应撰写 helper 脚本,只需单击一下或在无需用户干预的批处理模式下,即可为目标平台构建所有资源包 (assetbundles),

使用其他函数也可构建资源包 (assetbundles)。可在此处了解更多相关信息。

如何使用资源包 (assetbundle)?

需执行两个主要步骤才可使用资源包 (assetbundles)。第一步是从服务器或磁盘位置下载资源包 (assetbundle)。这一步使用 www 类来完成。第二步是从资源包 (assetbundle) 中加载应用程序中需使用的资源 (assets)。以下是一个 c# 脚本示例:

+ show [using an assetbundle] +

using unityengine;

using system.collections;

public class bundleloader :monobehaviour{

public string url;

public int version;

public ienumerator loadbundle(){

using(www www = www.loadfromcacheordownload(url, version){

yield return www;

assetbundle assetbundle = www.assetbundle;

gameobject gameobject = assetbundle.mainasset as gameobject;

instantiate(gameobject );

assetbundle.unload(false);

}

}

void start(){

startcoroutine(loadbundle());

}

}

此脚本作为组件 (component) 添加至游戏对象 (gameobject)。以下是加载资源包 (assetbundle) 的方法:

需要在检视器中设置 url 和版本值才可运行此脚本。url 即资源包 (assetbundle) 文件(通常是 internet 上的服务器)所在的位置。版本号允许开发人员把资源包 (assetbundle) 写入磁盘缓存时将其与一个编号关联起来。下载资源包 (assetbundle) 时,unity 将检查缓存中是否已存在该文件。如果存在该文件,unity 会将存储的资源版本与所需版本进行比较。如果两者不同,则将重新下载资源包 (assetbundle)。如果相同,则将从磁盘加载资源包 (assetbundle),不会重新下载文件。有关这些参数的更多信息,请参阅脚本组件手册中的 www.loadfromcacheordownload 函数。

如果调用此脚本的 start 函数,则将开始加载资源包 (assetbundle),并调用此函数作为协同程序。www 对象下载资源包 (assetbundle) 时,其上将生成此函数。通过此方法,www 对象完成下载前,此函数将只停在这一点上,但这不会阻碍执行其他代码,并且会在完成下载后生成此函数。

www 对象下载资源包 (assetbundle) 文件后,可使用 .assetbundle 属性检索资源包对象。此对象是从资源包 (assetbundle) 文件加载对象的界面。

在此示例中,资源包 (assetbundle) 中的预设引用是使用 .mainasset 属性从资源包中检索出来的。此属性是在构建资源包 (assetbundle) 时设置的,可传递一个对象 (object) 作为第一个参数。资源包 (assetbundle) 中的主资源可用于存储其资源包中含对象列表的文本资源 (textasset) 和任何其他相关信息。

请注意,上述示例比较简单,且未执行任何安全检查。请查看此处的代码了解更复杂的示例。

using unityengine;

using system.collections;

public class bundleloader :monobehaviour{

public string url;

public int version;

public ienumerator loadbundle(){

using(www www = www.loadfromcacheordownload(url, version){

yield return www;

assetbundle assetbundle = www.assetbundle;

gameobject gameobject = assetbundle.mainasset as gameobject;

instantiate(gameobject );

assetbundle.unload(false);

}

}

void start(){

startcoroutine(loadbundle());

}

}

此脚本作为组件 (component) 添加至游戏对象 (gameobject)。以下是加载资源包 (assetbundle) 的方法:

需要在检视器中设置 url 和版本值才可运行此脚本。url 即资源包 (assetbundle) 文件(通常是 internet 上的服务器)所在的位置。版本号允许开发人员把资源包 (assetbundle) 写入磁盘缓存时将其与一个编号关联起来。下载资源包 (assetbundle) 时,unity 将检查缓存中是否已存在该文件。如果存在该文件,unity 会将存储的资源版本与所需版本进行比较。如果两者不同,则将重新下载资源包 (assetbundle)。如果相同,则将从磁盘加载资源包 (assetbundle),不会重新下载文件。有关这些参数的更多信息,请参阅脚本组件手册中的 www.loadfromcacheordownload 函数。

如果调用此脚本的 start 函数,则将开始加载资源包 (assetbundle),并调用此函数作为协同程序。www 对象下载资源包 (assetbundle) 时,其上将生成此函数。通过此方法,www 对象完成下载前,此函数将只停在这一点上,但这不会阻碍执行其他代码,并且会在完成下载后生成此函数。

www 对象下载资源包 (assetbundle) 文件后,可使用 .assetbundle 属性检索资源包对象。此对象是从资源包 (assetbundle) 文件加载对象的界面。

在此示例中,资源包 (assetbundle) 中的预设引用是使用 .mainasset 属性从资源包中检索出来的。此属性是在构建资源包 (assetbundle) 时设置的,可传递一个对象 (object) 作为第一个参数。资源包 (assetbundle) 中的主资源可用于存储其资源包中含对象列表的文本资源 (textasset) 和任何其他相关信息。

请注意,上述示例比较简单,且未执行任何安全检查。请查看此处的代码了解更复杂的示例。

如何在编辑器中使用资源包 (assetbundles)?

构建应用程序是一个迭代过程,很可能需要对资源 (assets) 做多次修改,并且需要在每次修改后重新构建资源包 (assetbundles) 以便进行测试。虽然可以在编辑器 (editor) 中加载资源包 (assetbundles),但我们不建议您这样操作。相反地,测试编辑器 (editor) 时,您应使用 helper 函数 resources.loadassetatpath,无需使用和重新构建资源包。此函数可让您像从资源包 (assetbundle) 中加载资源 (asset) 一样加载该资源,但这将跳过构建步骤,并始终更新资源。

以下是一个 helper 脚本示例,此脚本用于加载资源 (assets),具体取决于您是否在运行编辑器 (editor)。请将此代码置于名为 assetbundleloader.cs 的 c# 脚本中::

+ show [using an assetbundle in the editor] +

using unityengine;

using system.collections;

public class assetbundleloader {

public object obj; // the object retrieved from the assetbundle

public ienumerator loadbundle(string url, int version, string assetname, string assetpath) where t :object {

obj = null;

#if unity_editor

obj = resources.loadassetatpath(assetpath, typeof(t));

if (obj == null)

debug.logerror ("asset not found at path:" + assetpath);

yield break;

#else

www download;

if ( caching.enabled ) {

while (!caching.ready)

yield return null;

download = www.loadfromcacheordownload( url, version );

}

else {

download = new www (url);

}

yield return download;

if ( download.error != null ) {

debug.logerror( download.error );

download.dispose();

yield break;

}

assetbundle assetbundle = download.assetbundle;

download.dispose();

download = null;

if (assetname == "" || assetname == null)

obj = assetbundle.mainasset;

else

obj = assetbundle.load(assetname, typeof(t));

assetbundle.unload(false);

#endif

}

}

如果正在运行创建应用程序,则可使用 assetbundleloader 脚本加载资源包 (assetbundle) 中的资源 (asset),如果正在编辑器 (editor) 中运行,则使用此脚本直接从工程 (project) 文件夹加载资源:

using unityengine;

using system.collections;

public class exampleloadingbundle :monobehaviour {

public string url = "http://www.mygame.com/mybundle.unity3d"; // url where the assetbundle is

public int version = 1; // the version of the assetbundle

public string assetname = "myprefab"; // name of the asset to be loaded from the assetbundle

public string assetpath; // path to the asset in the project folder

private object objinstance; // instance of the object

void start(){

startcoroutine(download());

}

ienumerator download () {

assetbundleloader assetbundleloader = new assetbundleloader ();

yield return startcoroutine(assetbundleloader.loadbundle(url, version, assetname, assetpath));

if (assetbundleloader.obj != null)

objinstance = instantiate (assetbundleloader.obj);

}

void ongui(){

guilayout.label (objinstance ?objinstance.name + " instantiated" : "");

}

}

上述脚本应保存至资源 (assets) 文件夹的 exampleloadingbundle.cs 文件中。将公共变量设为正确值并运行此脚本,脚本将使用 assetbundleloader 类加载资源 (asset)。然后将实例化此脚本,之后将通过 gui 显示出来。

using unityengine;

using system.collections;

public class assetbundleloader {

public object obj; // the object retrieved from the assetbundle

public ienumerator loadbundle(string url, int version, string assetname, string assetpath) where t :object {

obj = null;

#if unity_editor

obj = resources.loadassetatpath(assetpath, typeof(t));

if (obj == null)

debug.logerror ("asset not found at path:" + assetpath);

yield break;

#else

www download;

if ( caching.enabled ) {

while (!caching.ready)

yield return null;

download = www.loadfromcacheordownload( url, version );

}

else {

download = new www (url);

}

yield return download;

if ( download.error != null ) {

debug.logerror( download.error );

download.dispose();

yield break;

}

assetbundle assetbundle = download.assetbundle;

download.dispose();

download = null;

if (assetname == "" || assetname == null)

obj = assetbundle.mainasset;

else

obj = assetbundle.load(assetname, typeof(t));

assetbundle.unload(false);

#endif

}

}

如果正在运行创建应用程序,则可使用 assetbundleloader 脚本加载资源包 (assetbundle) 中的资源 (asset),如果正在编辑器 (editor) 中运行,则使用此脚本直接从工程 (project) 文件夹加载资源:

using unityengine;

using system.collections;

public class exampleloadingbundle :monobehaviour {

public string url = "http://www.mygame.com/mybundle.unity3d"; // url where the assetbundle is

public int version = 1; // the version of the assetbundle

public string assetname = "myprefab"; // name of the asset to be loaded from the assetbundle

public string assetpath; // path to the asset in the project folder

private object objinstance; // instance of the object

void start(){

startcoroutine(download());

}

ienumerator download () {

assetbundleloader assetbundleloader = new assetbundleloader ();

yield return startcoroutine(assetbundleloader.loadbundle(url, version, assetname, assetpath));

if (assetbundleloader.obj != null)

objinstance = instantiate (assetbundleloader.obj);

}

void ongui(){

guilayout.label (objinstance ?objinstance.name + " instantiated" : "");

}

}

上述脚本应保存至资源 (assets) 文件夹的 exampleloadingbundle.cs 文件中。将公共变量设为正确值并运行此脚本,脚本将使用 assetbundleloader 类加载资源 (asset)。然后将实例化此脚本,之后将通过 gui 显示出来。

如何缓存资源包 (assetbundles)?

可使用www.loadfromcacheordownload将资源包 (assetbundles) 自动保存至磁盘。请注意,网页播放器 (webplayer) 共有 50mb 的缓存上限(供全部网页播放器共用)如需更多空间,可购买一张独立的游戏缓存许可证。

资源包 (assetbundles) 是否兼容多个平台?

资源包 (assetbundles) 可兼容多个平台。请参考下表。

资源包在平台上的兼容性

独立式

网页播放器

ios

安卓 (android)

编辑器

y

y

y

y

独立式

y

y

网页播放器

y

y

ios

y

安卓 (android)

y

例如,在网页播放器 (webplayer) 目标发布平台激活的情况下,创建的资源包可与编辑器和独立版兼容。但是,它与为 ios 或安卓 (android) 平台创建的应用不兼容。

如何查找资源包 (assetbundles) 中的资源?

构建资源包 (assetbundles) 时,可通过文件名(无需扩展名)在内部查找资源。例如,如果使用默认方法,则可使用 “mytexture” 查找和加载工程 (project) 文件夹中位于 “assets/textures/mytexture.jpg” 的纹理 (texture) 使用buildpipeline.buildassetbundleexplicitassetnames构建资源包 (assetbundle) 时,提供自有的每个对象 id(字符串)数组更有助于您管理这些资源。

是否可在其他游戏中重复使用我的资源包 (assetbundles)?

您可在不同游戏中共享资源包 (assetbundles) 内容。要求是,从资源包 (assetbundles) 的游戏对象 (gameobjects) 中引用的任何资源 (assets) 必须包含在资源包 (assetbundle) 中,或存在于该应用程序(在当前场景中加载的应用程序)中。构建资源包 (assetbundle) 后,要确保引用的资源 (asset) 包含在其中,您可传递buildassetbundleoptions.collectdependencies选项。

现在构建的资源包 (assetbundles) 是否可用于将来版本的 unity?

资源包 (assetbundles) 包含名为类型树的结构,该结构可让不同版本的 untiy 正确理解资源类型的相关信息。默认情况下,台式机将包含类型树,但也可通过将buildassetbundleoptions.disablewritetypetree传递至 buildassetbundle 函数禁用此结构。网页播放器本身依赖类型树,所以其始终包含类型树(即 disablewritetypetree 选项不可用)。移动和控制台资源包从不包含类型树,因此每当序列化格式发生变更时,则需重新构建这些资源包。新版本的 unity 可能出现上述情况。(除 bugfix 版本外) 如果添加或删除添加包含在资源包中的 monobehaviour 的已序列化字段,则也会出现上述情况。如果必须重新构建资源包 (assetbundle),unity 将在加载资源包时显示错误消息。

如何列出资源包 (assetbundles) 中的对象

您可使用assetbundle.loadall检索包含资源包 (assetbundle) 中所有对象的数组。您无法直接获取标识符列表。常用的变通方法是保留一个独立的文本资源 (textasset),以保留资源包 (assetbundle) 中的资源名称。

返回资源包 (assetbundles) 简介

上一篇:三维格式下一篇:访问隐藏文件夹

相关阅读

文章点评
相关文章
Unity大学【第二期】!