アセットバンドルで作業するときに主に 2 つのステップがあります。最初のステップはアセットバンドルをサーバーまたはディスク上のロケーションからダウンロードします。これは 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());
}
}
このスクリプトはゲームオブジェクトにコンポーネントとして追加されます。アセットバンドルは次の方法により読み込まれます。
簡単にするために、前の例では、すべての安全チェックを行なっておりませんのでご注意ください。より完全な例については [http://translate.unity3d.com/html/ja/Manual/DownloadingAssetBundles.html] を参照してください。
アプリケーションの作成は反復的なプロセスなので、かなりの頻度でアセットを何度も修正し、これによりテストするためにはアセットバンドルを毎回の変更の度に再ビルドする必要が出てきます。エディターにアセットバンドルを読み込むことは可能ですが、これは推奨できるワークフローではありません。その代わりに、エディターをテストする際は、Reources.LoadAssetAtPath ヘルパー関数を使用して、アセットバンドルを使用するときに再ビルドを回避できます。この関数によりアセットバンドルから読み込んだかのようにアセットを読み込めますが、ビルドプロセスはスキップされアセットは常に最新となります。
次はヘルパースクリプトの例で、エディターで実行しているかどうかにかかわらずアセットを読み込めます。このコードを AssetBundleLoader.cs という C# スクリプトに入れてください。
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" : "");
}
}
前述のスクリプトにより、Assets フォルダーの中に ExampleLoadingBundle.cs というファイルを保存します。正しい値にパブリック変数をセットして実行した後、AssetBundleLoader クラスを使用してアセットを読み込みます。次にインスタンス化されて、GUI で表示されます。
WWW.LoadFromCacheOrDownload を使用して、自動的にアセットバンドルをディスクに保存することができます。より多くのスペースが必要である場合は、ゲームで別のキャッシングライセンスを購入できます。
アセットバンドルを StreamingAssets フォルダーに非圧縮のアセットバンドルとして保存している場合、AssetBundle.CreateFromFile でディスク上のアセットバンドルを参照します。アセットバンドルを StreamingAssets フォルダーに圧縮したアセットバンドルとして保存している場合、キャッシュに AssetBundle の圧縮されていないコピーを作成され WWW.LoadFromCacheOrDownload を使用する必要があります。
アセットバンドルはプラットフォーム間で互換性があります。次の表をガイドラインとして使用してください。
アセットバンドルのプラットフォーム間の互換性 | |||
Standalone | iOS | Android | |
Editor | サポート | Y* | Y* |
Standalone | サポート | ||
iOS | サポート | ||
Android | サポート |
(*) モバイルプラットフォーム向けにビルドされたアセットバンドルは、エディターが実行されているプラットフォームとは互換性のない、特定プラットフォーム向けに最適化された形式で保存されたデータを含んでいる可能性があります。ゲームを配信する際は、プラットフォームごとにアセットバンドルを作成した方が安全です。例えばシェーダーはプラットフォーム毎に異なります。
E.g. GI data is stored in a format optimized for ARM architecture and thus is not loadable on x86 CPUs. Shaders are stored for OpenGLES 2 configuration and are not loadable by the Editor which uses the DX9/11 renderer (but works with OpenGLCore renderer). During development, you are recommended to use Simulation Mode mentioned in AssetBundles and the AssetBundle Manager tutorial to avoid Editor and mobile platforms incompatibility.
アセットバンドルをビルドするときアセットは、拡張子を除いたファイル名で、内部的に識別できます。例えばプロジェクトフォルダーの “Assets/Textures/myTexture.jpg” に配置されたテクスチャはデフォルトのモードだと “myTexture” として識別して読み込まれます。これをより細かく設定するには、アセットバンドルをビルドするときに BuildPipeline.BuildAssetBundleExplicitAssetNames を用いて各オブジェクトに対してカスタムの ID (文字列)の配列を提供します。
アセットバンドルにより異なるゲーム間でコンテンツを共有することができます。必要な要件として、アセットバンドルに含まれるゲームオブジェクトにより参照されるすべてのアセットはアセットバンドルに含まれているか、アプリケーションの中に存在する(現在のシーンで読み込まれている)必要があります。参照されたアセットがビルドされたときにアセットバンドルに含まれることを保証するためには BuildAssetBundleOptions.CollectDependencies を渡します。
AssetBundles can contain a structure called a type tree, which allows information about Asset types to be understood correctly between different versions of Unity. The type tree is included by default on almost all platforms, but can be disabled by passing the BuildAssetBundleOptions.DisableWriteTypeTree to the BuildAssetBundle
function.
Type trees are not supported when using the .NET scripting backend with Windows Store/Universal Windows Platform targets, so you need to rebuild these bundles whenever the serialization format changes. This can happen in newer versions of Unity. It also happens if you add or remove serialized fields in MonoBehaviours that are included in the AssetBundle. When loading an AssetBundle, Unity gives you an error message if the AssetBundle must be rebuilt.
AssetBundle.LoadAllAssets を使用してアセットバンドルに含まれるすべてのオブジェクトを含む配列を取得することができます。識別子の一覧を直接に取得することはできません。良くある回避策は、別の TextAsset を保持して、アセットバンドルのアセットの名前を保持することです。
例えば、バンドル A が、マテリアルとテクスチャを持つプレハブを含んでいるとします。そしてバンドル B は、その同じプレハブのインスタンスを持つシーンを含んでいるとします。Bundle B はマテリアルにアクセスできる必要があります。マテリアルが特定のアセットバンドルに含まれているのでなければ、バンドル A と B の両方に含められます。