Unity 生成済みのアセットバンドルの中身を確認するプロジェクトを作成しました

![ドリコム Advent Calendar 2017](https://tech.drecom.co.jp/wp-content/uploads/2017/11/eyecatch_1712AdventCalendar_header.png)

これは[ドリコム AdventCalendar 2017](https://adventar.org/calendars/2575) の 22日目の記事です。
21日は[志村](https://adventar.org/users/16575)さんによる「[変態エンジニアになりたかった私が素直に勉強できるようになるまで](https://tech.drecom.co.jp/i-want-to-be-a-specialist/)」でした。

アセットバンドルの中身を確認するUnityプロジェクトを作成しました。
この記事ではこのUnityプロジェクトについての紹介を行います。

# 自己紹介

ドリコムでゲームアーキテクトグループに所属しています。広井です。
主にゲームアプリの開発に役立つライブラリやツールを作っています。
Unityではアセット関連の機能を整備・調査を担当することが多く、今回はその中でアセットバンドル調査についての便利ツールをまとめたUnityプロジェクトができたので紹介してみます。

# このUnityプロジェクトの概要

## 目的

自己紹介でも少し触れましたが、自分はアセット関連の調査をすることが多いです。その中でもとくにアセットバンドルについての調査の件数が多いです。

調査対象となるのはそれぞれのゲームアプリのUnityプロジェクトですが、以下のような特徴がありゲームアプリのUnityプロジェクトを利用した調査がしにくいという問題がありました。

|ゲームアプリの特徴|ゲームアプリを利用して調査する際の問題|
|:--|:--|
|開発が進んでいるプロジェクトはほぼ共通してビルド時間が長い|調査に時間がかかってしまう|
|弊社ゲームアプリではそれぞれゲームに合った設計でアセットバンドルの利用をしている|アセットバンドルの問題なのかゲームアプリ起因の問題なのかの切り分ける必要がある|
|弊社ゲームアプリではそれぞれ実機ビルド設定がある|アプリごとの設定に従う、もしくは、テスト用の設定に上書きする必要がある|

上記の問題を極力排除できるようにしたのが、このUnityプロジェクトです。

## リポジトリ

AssetBundleTestProject
https://github.com/junjanjon/AssetBundleTestProject

## 使い方

1. Unity の任意のバージョンの Unity でプロジェクトを開く。確認した一番下のバージョンは 5.5系です。
2. Assetsの直下に「StreamingAssets」というフォルダを置いて、その中に調査対象のアセットバンドルを配置する。
3. 「AssetBundleLoadTester/GuiAssetBundleLoadTestScene.unity」を開いて再生する。

|再生直後の画面|1つボタンを押した直後|
|:-:|:-:|
|![使い方1](https://qiita-image-store.s3.amazonaws.com/0/63607/8b05d8d1-dc43-5090-2590-9b4f1c30b61a.png)|![使い方2](https://qiita-image-store.s3.amazonaws.com/0/63607/ab1a5a1a-9d4c-da6e-506e-9a914d6d7250.png)|
|再生画面"左半分"に出ているボタンがアセットバンドルをロードするボタンになっています。|アセットバンドルをロードすると再生画面"右半分"にボタンが出現します。アセットバンドルから特定のアセットをロードするボタンになっています。|

|アセットバンドルからプレハブのアセットをロードした画面|
|:-:|
|![アセットロード後1](https://qiita-image-store.s3.amazonaws.com/0/63607/d5b846a8-99c1-9ddb-6a18-1bc007e86a91.png)|
|![アセットロード後2](https://qiita-image-store.s3.amazonaws.com/0/63607/d07386cf-9883-7f6a-ae03-d4ebecb74031.png)|

「アセットバンドルをロードするボタン」、「アセットバンドルからアセットをロードするボタン」を使って、自由にアセットをロードすることができ、
ロード後はデバッグログやインスペクターからアセットの中身を確認できます。

アセットバンドルの中身を確認したいという用途はこれで満たすことができます。

ほかにもアセットバンドルをビルドする機能やロード時にアセットバンドルの依存関係を考慮するオプションがありますが、詳しくはリポジトリのREADMEを参照してください。

## 実用例: アセットバンドルの中身を確認する

ゲームアプリで特定のアセットバンドルについての調査が必要になったら、まずは調査対象のアセットバンドルをいただいて、このプロジェクトで中身を確認しています。

このプロジェクトで確認することでアプリ起因の問題は起きなくなるため、アセットバンドルの問題かアプリ起因の問題かを切り分けることができます。
また、このプロジェクトはアセットバンドル関連の機能しかないので、ビルド時間が短く、短いイテレーションで調査することができています。実機ビルドやスクリプトの調整が必要な場合に、短いイテレーションが効果的です。

## 実用例2: バグレポートを送る

実用例の2つ目として Unity　へバグレポートを送る際にも利用しています。
このプロジェクトは操作手順を単純にしているのでバグレポートに再現手順を書くことも簡単になり、バグレポートを送ることに抵抗が減ってよかったと感じています。

出会ったバグとしては、「[Animator コンポーネントを含むアセットバンドルを非同期でロードすると Unity Editor がアサートを出してしまう](https://issuetracker.unity3d.com/issues/loading-an-asset-that-has-an-animator-component-from-an-asset-bundle-with-loadasync-throws-assertion-failed-error)」や「アセットバンドルのロード順によってスクリプト内の変数が初期化される[^1][^2]」 がありました。


[^1]: 発生バージョン不明（5.5.2p3で確認）、修正バージョンは 5.6.3p3, 2017.1.1p2 以降。
[^2]: アセットバンドルのロード順によるバグは [こちらの記事](https://qiita.com/satotin/items/cdf88c71a936131f09e6) にも記載がありました。

# まとめ

- アセットバンドルの中身を確認するプロジェクトを紹介しました。
- 専用のプロジェクトを用意したことで調査の効率が上がりました。
- このプロジェクトはオープンソースなのでお気軽に使っていただき、また疑問点等があればご連絡をお願いいいたします。

自分には Unity のアセットやアセットバンドルはブラックボックスな部分が多い印象がまだあります。その印象の原因はアセットをランタイムで気軽に確認することが難しいからだと感じています。
このプロジェクトで気軽に確認できる環境を用意できたため、気になったことを追っていくことでより理解していきたいと思っています。
また、利用してくれる方にとってもこのプロジェクトが理解の手助けになれば幸いです。

明日23日目は[アオイ](https://adventar.org/users/16580)さんです。