どこかで見た、どこにもない場所へ

Unity や ゲーム開発に関する技術記事を掲載しています。ブログ NG の会社から ブログ OK の会社に転職しました。

【Unity】これだけは読んでおけ!AssetBundle を使う前に知っておきたい辛いこと

Unity の AssetBundle を使おうとすると、Unity 標準の API を使った AssetBundle の情報が少ないことに驚きます。AssetBundle 使っている人はごく少数しかいないのではないか?と思うほどです。

それもそのはずです。Unite 2017 Tokyo の セッション でもありましたが、公式のリファレンスやサンプルが役に立たないことや現在の AssetBundle の仕様が酷いことが問題なのです。今回は、AssetBundle の仕組みを実装する前に知っておきたい 辛いこと を紹介します。

5 つの辛いこと

ドキュメントが実践的でなくて 辛い

公式マニュアル は一見すると丁寧に情報が記載されているように思えます。もちろん、重要な情報もあるので一度は必ず読んでおくべきです。ただし、読み終えたあなたはこう思うはずです。

「それでどう作ればいいの?」

そして、日本語ドキュメントは 5.4.0 までしかありません。

開発環境が貧弱で 辛い

AssetBundle を使うために便利な開発ツールはいくつ用意されているでしょうか?

答えは 0 です。

何もありません。「AssetBundle をビルドするツール」も「AssetBundle の中身確認ツール」もありません。全部作る必要があります。

システムやツールを作るための API は公開されていますが、その API の粒度もバラバラで思ったことが出来ません(例えばキャッシュは一括でしか行えないとか・・・)。

公式のサンプルが中途半端で 辛い

AssetBundle の 公式サンプルコード がかろうじて公開されています。しかし、2015年からまったく更新されていません。もっと調べた人は このリポジトリ を見つけることでしょう。「やった!更新されてる!」と思ったところ申し訳ありません。それも役には立ちません。

少なくとも AssetBundle の仕組みに実務レベルで必要な機能やツールは

  1. AssetBundle のビルドツール
  2. Asset を効率的に AssetBundle に含めるためのヘルプツール
  3. AssetBundleName を自動付与するツール
  4. AssetBundle のダウンロードしてキャッシュする機能
  5. AssetBundleName からビルド前の Asset を読み込める開発用機能
  6. ロードした AssetBundle と Asset のメモリ管理機能

このうち、公式サンプルコードには 1,4,5 しか含まれていません。更に、メモリ管理などを考えた場合、あまり良い設計になっているとは言えません。

Unity のバージョンアップが出来なくて 辛い

Unity のバージョンを上げると、AssetBundle もビルドし直さなければならないことがあります。この場合、古い AssetBundle を保持しているユーザはどうしなければいけないでしょうか?

それらのユーザは 新しい AssetBundle を全てダウンロードする ことになります。

ゲームは何も変えていないのに、Unity をバージョンアップしただけでコンテンツの再ダウンロードが何度も行われるのです。こんなユーザを失うようなリスクは犯したくないですよね。

それでも、AssetBundle を使うのであれば、この問題と向き合わなければなりません。

AssetBundle の仕様がやんちゃで 辛い

ここまで読んだ人はなんでこんな無茶苦茶な仕様なんだ!!と思ったはずです。
安心して下さい、もっとたくさんやんちゃな仕様がありますよ!

  • Variant がまともに使えない
  • 読み込み時間がプラットフォームでバラバラ(しかも手を入れられない)
  • メインスレッドでしか呼び出せない API たち
  • 暗号化するために TextAsset にしなければならない
  • etc…

そして、開発者はそれぞれの道へ・・・

AssetBundle がどれだけ辛いかお分かりいただけたでしょうか。AssetBundle の仕組みをちゃんと実装することは茨の道なのです。

Unity 標準の API のみを使った純粋な AssetBundle の記事やサンプルが少ないのは、そのままでは役に立たない からです。なので、巷にはキャッシュ機能を自作したとかダウンロードを別スレッドで行ったとか、アドバンスドな記事が多いわけです。

アドバンスドな記事を書いた人たちも最初は標準の API で AssetBundle の仕組みを実装したのだとは思いますが・・・。

まとめ

なぜアドバンスドな記事やネガティブな記事が多いのか、AssetBundle を取り巻く現状を知って欲しいと思い、この記事を書きました。誰も標準 API のみを使った素晴らしい AssetBundle システムの手引書を持ってないのです(そもそも作れない)。

しかし、アドバンスドな記事を読んで、最初から全て独自実装するのは危険です。できるだけ標準の機能に頼ったほうが だからです。Unity 2017 以降では AssetBundle の改善が多数盛り込まれていますので、現在の API の正しい使い方や問題点をあなた自身で試しておくことはとても重要なことです。