|
我如何使用资源包?
主要有两个步骤的工作中时。第一步是下载的资源包从服务器或磁盘位置。这是通过WWW类。第二步是从资源包加载的资产,可以在应用程序中使用。下面是一个例子,C #脚本:
using UnityEngine;
using System.Collections;
public class BundleLoader : MonoBehaviour{
public string url;
public int version;
public IEnumerator LoadBundle(){
while (!Caching.ready)
yield return null;
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());
}
}
这个脚本添加到一个游戏对象组件。AssetBundle加载方式如下:
URL和版本的值需要被设置在检查员来运行这个脚本之前。URL的资源包文件的位置,通常在一个网络服务器。版本号允许开发者将一号AssetBundle当写入磁盘缓存。当下载资源包统一将检查如果缓存中已经存在的文件。如果是这样,它比较存储资产的版本的版本要求。如果是不同的资源包将redownloaded。如果是相同的,那么它将加载资源包从磁盘和避免下载文件。有关这些参数的更多信息,请参考脚本参考的www.loadfromcacheordownload功能。
当这个脚本的启动函数被调用时,它将启动加载AssetBundle的协程函数调用,函数将产生对WWW的对象作为它的下载资源包。利用该功能将停止,直到WWW对象完成下载,但不会阻止其它的代码的执行,直到完成它的收益率。只有达到一个资源包下载完成每帧时,下载www.loadfromcacheordownload。
一旦下载资源包WWW对象文件的相关属性,用于检索资源包对象。这个目标是从资源文件加载对象的接口。
在本例中指AssetBundle预设是使用资源包mainasset属性检索。此属性设置建筑AssetBundle传递一个对象作为第一个参数时。在资源包的主要资产可用来存储textasset用列表里面AssetBundle对象和其他任何关于他们的信息。
请注意,为了简单起见,前面的例子是不做任何安全检查。请看代码在这里一个完整的例子。
我如何在编辑器中使用资源包?
创建应用程序是一个迭代的过程,那么你将很有可能改变你的资产的许多倍,这就需要重建中的每一个变化能够测试后。虽然可以在编辑器加载资源包,这是不建议的工作流程。相反,在测试编辑器中你应该使用辅助功能resources.loadassetatpath避免资源的利用和改造。这个功能让你负荷的资产就像是从一个资源包加载,但会跳过建设过程和你的资产总是最。
下面是一个例子辅助脚本,你可以使用加载您的资产取决于如果你在编辑或没有运行。把这段代码在C #脚本命名assetbundleloader.cs:
using UnityEngine;
using System.Collections;
public class AssetBundleLoader {
public Object Obj; // The object retrieved from the AssetBundle
public IEnumerator LoadBundle<T> (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脚本从一个资源包加载一个资产如果我们运行内置的应用程序或加载的资产直接从项目文件夹如果在编辑器中运行:
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 <GameObject> (url, version, assetName, assetPath));
if (assetBundleLoader.Obj != null)
ObjInstance = Instantiate (assetBundleLoader.Obj);
}
void OnGUI(){
GUILayout.Label (ObjInstance ObjInstance.name + " instantiated" : "");
}
}
先前的脚本应该被保存到一个名为exampleloadingbundle.cs里面的资产文件夹文件。在设置公共变量的正确值并运行它,它会用assetbundleloader类加载一个资产。然后实例化,这会显示使用GUI。
怎么在缓存中的assetbundles吗?
你可以使用www.loadfromcacheordownload这会自动保存到磁盘中。要知道你是限制50MB总WebPlayer(之间的所有网络播放器共享)。你可以为你的游戏买一个单独的缓存许可如果你需要更多的空间。
如果你的资源存储在streamingassets压缩文件夹中,您可以使用assetbundle.createfromfile到磁盘上的相关参考。如果在streamingassets文件夹中是压缩的,您将需要使用www.loadfromcacheordownload创建缓存的资源包一个未压缩的副本。
是资源的跨平台?
在有一些平台中是兼容的。使用下表作为指南。
对于资源的平台兼容性
独立 WebPlayer iOS 安卓
编辑 Y Y Y * Y *
独立 Y Y
WebPlayer Y Y
iOS Y
安卓 Y
例如,一束而建立的目标是积极创造WebPlayer将编辑器兼容与独立的建立。然而,它不是专为iOS或Android平台的应用程序兼容。
(*)专为移动平台中可能包含存储在数据优化、平台特定的格式是不兼容的平台上运行的编辑器。请注意,它是安全的假设,发表游戏需要不同的资产包每平台。具体材质不同平台之间。
例如GI数据储存格式为ARM架构的优化从而不加载的x86 CPU。 着色器存储OpenGLES 2配置和不加载编辑器,使用DX9 / 11通过渲染器(与openglcore但渲染)。 在开发过程中,建议您模拟模式提到资源和资源管理器教程以避免编辑和移动平台不兼容。
在确定资产资源如何?
当你建立资源资产进行内部的文件名没有扩展。例如一个纹理位于你的项目文件夹的“资产/材质/ mytexture .jpg”识别和加载使用“mytexture”如果你使用默认的方法。您可以提供您自己的阵列在这更多的控制系统(字符串)每一个对象,当你建立了带有buildpipeline.buildassetbundleexplicitassetnames。
我可以在另一场游戏中重用我吗?
资源包让你分享不同的游戏内容。的要求是,任何资产,你的资源对象的引用必须包含在资源包。确保引用的资产包括在资源包时,你可以通过建立buildassetbundleoptions.collectdependencies选项
将资源包建设可使用统一的未来版本吗?
资源包可以包含一个结构叫做型树它允许对资产类型的信息被正确理解的不同版本之间的团结。在桌面平台,类型树包含默认情况下却可以通过禁用buildassetbundleoptions.disablewritetypetree对类似的功能。网络播放器本质上依赖型树,所以它总是包含(即的disablewritetypetree选项不起作用)。型树从不包含移动和控制台的资产包,所以你将需要重建这些束每当序列化格式的变化。这可以在统一的新版本发生。(除了修正稿)也会发生如果你添加或删除字段的序列化MonoBehaviour中所包含的资产包。当加载资源包统一会给你如果AssetBundle必须重建一个错误消息。
我怎么能列出资源包的对象呢?
你可以使用assetbundle.loadallassets获取数组中的所有对象的资源包。它是不可能直接得到一个列表的标识符。常用的解决方法是保持一个单独的textasset在AssetBundle持有资产的名称。
如何借鉴其他资源的资源资产
假设束包含预制具有材质和纹理。束B有场景具有相同的预置的一个实例。束B需要访问材料。除非材料包括在一个特定的资产包将包括A、B两束
|
|