# unity03.2ex. Asset Bundlesの詳細
________________________________________
## 1. AssetBundles
________________________________________
### 1.1. AssetBundles の概要

- 各Assetをプラットフォーム圧縮
- 形式は独自アーカイブ化 + LZMAかLZ4再圧縮
- LZ4キャッシュ管理 + API

※ Resourcesフォルダと干渉するため、Resources下のAssetに対して操作は非推奨

________________________________________
### 1.2. 旧来の方法(Addressableを使えばこの方法は不要)

アセットバンドルのワークフロー  
https://docs.unity3d.com/ja/2022.3/Manual/AssetBundles-Workflow.html

準備とAssetBundle化

1. フォルダまたはAssetを選択し、インスペクタ下部でAssetBundleを指定
    - AssetBundleはフォルダ構造が可能
    - Variant名(AssetBundleの別名)は未指定でもOK
2. お試しスクリプトでWindows向けにビルド(=圧縮&アーカイブ)する
    - ↑のサイトを参照の事

AssetBundleの使用(同伴アーカイブの場合)

```cs
using UnityEngine;

        // AssetBundle自体のロード
        // Application.streamingAssetsPathは、プラットフォームごとのデフォルトフォルダを参照する
        // Win : Application.dataPath + "/StreamingAssets"
        // iOS : Application.dataPath + "/Raw"
        // And : "jar:file://" + Application.dataPath + "!/assets/"
        var loadedBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));

        // Assetのロード
        var prefab = loadedBundle.LoadAsset<GameObject>("MyObject");
```

AssetBundleの使用(非同伴アーカイブの場合)

```cs
using UnityEngine;
using UnityEngine.Networking;

// ...

        // AssetBundle自体のロード
        // この方法でダウンロードされたAssetBundleは圧縮形式に関わらず、ローカル側では解凍後にlz4で圧縮されてキャッシュされる
        string url = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
        var request = UnityWebRequestAssetBundle.GetAssetBundle(url, 0);
        yield return request.Send();
        var loadedBundle = DownloadHandlerAssetBundle.GetContent(request);

        // Assetのロード
        var prefab = loadedBundle.LoadAsset<GameObject>("MyObject");
```

________________________________________
### 1.3. AssetBundleの動作詳細

BuildAssetBundleOptions

- None : LZMA圧縮
- UncompressedAssetBundle : 非圧縮
- ChunkBasedCompression : LZ4圧縮

BuildTarget

- 略

AssetBundle化の仕様

- AssetBundleに含めるAssetが他のAssetに依存している時、依存しているAssetも含める
- 異なるAssetBundle同士が同一のAssetに依存している時、それぞれにAssetが含まれる(重複してしまう)
- 依存Asset自体が明示的にいずれかのBundleに含まれれば、このようなことは起きない
    - ただし、依存Bundleのロードは自動的に行われないため、Load順序に気を付ける必要がある
- 依存関係自体は、manifestをロードすれば確認することが可能
    - 言い換えると、(Addressableを使わない限り)Bundle間の依存関係の解決は自前で管理が必要

```cs
var ab = AssetBundle.LoadFromFile(manifestFilePath);
ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] dependencies = manifest.GetAllDependencies("fooBundle");
```

AssetBundleのロード方法の種類

- AssetBundle.LoadFromMemoryAsync
- AssetBundle.LoadFromFile
- AssetBundle.LoadFromStream
- UnityWebRequestAssetBundle.GetAssetBundle