AssetBundleのサンプルを作成した時のメモ


# 使用したUnityのバージョン

5.3.2f


# AssetBundleとは

- Asset(資源)管理の仕組み
- インターネット経由でリソースのDLができる
- バージョン管理ができる


# AssetBundleの作成

1. AssetBundleの名前をマーキング
2. Editor Scriptを実行
3. サーバにアップロード

## 1. AssetBundleの名前をマーキング

AssetBundleに含めるディレクトに名前をマーキングする。

![スクリーンショット 2016-02-24 16.55.20.png](https://qiita-image-store.s3.amazonaws.com/0/2278/9f2c8855-7a22-0b43-f610-6c9d8cd9fa1a.png "スクリーンショット 2016-02-24 16.55.20.png")

## 2. Editor Scriptを実行

AssetBundleを生成するためのスクリプトを作成し、
Editorフォルダに配置する。

```csharp:ExportAssetBundle.cs
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;


public class ExportAssetBundle
{
	[MenuItem("Export/AssetBundle")]
	static void Export()
	{
		Directory.CreateDirectory(Application.streamingAssetsPath);
		BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath);
	}
}
```

このスクリプトをEditorフォルダに配置すると、
Unityのメニューに「Export」という項目が増える。

![スクリーンショット 2016-02-24 17.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/2278/b6beff35-656f-0df7-ae76-f12f533ef4f3.png "スクリーンショット 2016-02-24 17.05.10.png")

「Export -> AssetBundle」を選択すると、
AssetBundle生成処理が実行される。

## 3. サーバにアップロード

上記のスクリプトを実行すると、
StreamingAssetフォルダが生成されるので、
このフォルダをサーバにアップロードする。


# AssetBundleの読み込み(サーバ)

サーバにあるAssetBundleからリソースをロードする流れは、次のとおり。

1. WWW.LoadFromCacheOrDownloadで、AssetBundleをダウンロード
2. ダウンロードしたAssetBundleから目的のリソースをLoadAssetメソッドで読み込む

ソースは以下のようになる。

```csharp:CachingLoadExample.cs
using UnityEngine;
using System.Collections;

public class CachingLoadExample : MonoBehaviour
{
	string bundleURL = "http://localhost:9000/assets/StreamingAssets/sprites";
	string assetName = "Test";
	int version = 0;

	void Start()
	{
		StartCoroutine(DownloadAndCache());
	}

	IEnumerator DownloadAndCache()
	{
		while(!Caching.ready)
			yield return null;

		using(WWW www = WWW.LoadFromCacheOrDownload(bundleURL, version)) {
			yield return www;

			if (www.error != null) {
				throw new UnityException("WWW download had an error" + www.error);
			}

			AssetBundle bundle = www.assetBundle;

			Instantiate(bundle.LoadAsset(assetName));

			bundle.Unload(false);
		}
	}
}
```


# AssetBundleの読み込み(ローカル)

Unityのプロジェクト内にあるStreamingAssetsからリソースを読み込むこともできる。

AssetBundleの読み込みはAssetBundle.LoadFromFileAsyncメソッドで行う。


```csharp:LoadAssetBundle.cs
using UnityEngine;
using System.Collections;

public class LoadAssetBundle : MonoBehaviour
{
	string assetName = "Test";

	string AssetPath {
		get {
			return Application.streamingAssetsPath + "/sprites";
		}
	}

	IEnumerator Start()
	{
		var resultAssetBundle = AssetBundle.LoadFromFileAsync(AssetPath);

		yield return new WaitWhile(() => resultAssetBundle.isDone == false);

		var assetbundle = resultAssetBundle.assetBundle;
		var resultObject = assetbundle.LoadAssetAsync<GameObject>(assetName);

		yield return new WaitWhile(() => resultObject.isDone == false);

		GameObject.Instantiate(resultObject.asset);
		assetbundle.Unload(false);
	}
}
```


# 参考

WWW
http://docs.unity3d.com/ja/current/ScriptReference/WWW.html

AssetBundle
http://docs.unity3d.com/ja/current/ScriptReference/AssetBundle.html

Unity 5 の AssetBundle について (浅く) まとめてみた
http://www.slideshare.net/monry84/20150522-31-unity

【Unity】Unity 5.3からAssetBundleはどう変わるのか…まとめ
http://tsubakit1.hateblo.jp/entry/2015/12/16/233336

Unity5の新しいAssetBundle機能を使ってサーバーからAssetBundleをダウンロードする
http://kazuooooo.hatenablog.com/entry/2015/06/14/150019