ビルド、ファイル管理、DLの基本的概要と注意点
ノベルゲームでは、たくさんのテクスチャを扱う必要があるため、
基本的にはResourcesというフォルダ以下にリソースを置いて「必要になったときにロードする」という方法をとっています。
ですが、この方式ではアプリサイズが肥大化したりと色々と問題もあります。
そのため、宴3からはUnityのアセットバンドルを使うことで、Resources以外からファイルをロードできるようにしています。
宴2以前のやり方はこちらになります
目次
基本的なビルドとその問題点
ノベルゲームをUnityで作成しようとすると、「アプリサイズが想定よりもかなり大きくなる」ということが起きがちです。
Unityでアプリをビルドすると、BuildSettingsで設定したシーンで使用している全アセットの他に、
(サブフォルダ含めて)全てのResourcesフォルダ以下にある全アセットと、StreamingAssetsフォルダ以下にある全ファイルがアプリに含まれます。
特にResources以下にあるアセットは「全て1つのファイルに無圧縮でパックされる」という特徴があります。
これがアプリサイズが肥大化する主な原因です。
特にノベルゲームのようにたくさんの素材(フルボイスで、なおかつ高解像度のテクスチャを扱い、ムービーも多数)を使うゲームは、数Gという巨大なファイルができることになります。
Windows32bit機のようなケースでは、2Gを超えるファイルを扱えない場合があるため、「ゲームが起動すらしない」ということになります。
また、AndroidやiOSの場合はビルド後のアプリ全体に圧縮がかかるのですが、こちらには100MB制限というものがあります。
(AndroidやiOSの公式ストアの決まりで、100MBを超えるアプリの場合はアプリのDLにWifiが必須になったりデータ用にファイルを分ける必要がある)
そのため、アプリにはリソースを含めずに「データは後から追加でDLする」ということが必要になるケースがあります。
アセットバンドル
Resources以下にアセットを置くやり方はシンプルで作りやすいのですが、上記のようにファイルサイズを抑えづらいなど色々な問題があります。
UnityとしてもResourcesは推奨しなくなっているようです。
そのためには、Resourcesを使わずにアセットをロードできるアセットバンドルという仕組みを使います。
アセットバンドル(AssetBundle)は、アプリに含めていないファイルを追加でDLしたりするための仕組みですが、応用することでアプリのファイルサイズ削減にも使えます。
宴では、リソースコンバーターを使うことで、宴の管理対象のリソースを全てアセットバンドル化できます。
作成したアセットバンドルは、StreamingAssets以下置いたり、サーバーに置くことで、Resourcesを使わずにアセットのロードができるようになります。
AdvEngineStarterの設定
AdvEngineStarterコンポーネントで、宴の起動時の設定ができます。
ここにStrageType(リソースの置き場)や、DLする場合のサーバーのURLなどを記述することで、ファイルのロードの仕方を変えることができます。
代表的な二つの設定について、それぞれやり方をまとめておきます。
StreamigAssetsを使ってアプリサイズ削減
作成したアセットバンドルをStreamingAssetsフォルダに置いて、アプリ全体のサイズを削減します。
詳細はこちらに
サーバーからダウンロード
作成したアセットバンドルをサーバーに置いてアプリ起動後に追加DLします。主にモバイルでの100MB制限を回避するためのものです。
詳細はこちらに
アセットバンドルの注意点
アセットバンドルは便利な仕組みなのですが、少し特殊でいくつか注意点があります。
殆どのケースは、サーバーからDLしてキャッシュを使う場合のみのものですが、以下にまとめておきます。
作成に長時間かかる
アセットバンドルの作成には長時間かかります。リソースコンバーターの設定次第で若干ですが緩和することが可能です。
さらに、Unity5.5では数が増えると指数的に時間が増えてしまう不具合があります
ハッシュ値が不安定
アセットバンドルを作成する際に、前のバージョンと内容が全く変わらなくても、ハッシュ値(宴ではバージョン番号として使用)が変わることがあります。
そのため、同じ内容のファイルをバージョン違いとして再度DLさせてしまう可能性があります。
これはアセットバンドルの作成時に原因があるため、アセットバンドを再作成しなければ起きない問題です。
またアセットバンドルを作成する際のローカルPCのキャッシュによってハッシュ値が決まるらしいので、ビルドマシンやその中のプロジェクト構成をなるべく変えないようにしたほうが良いでしょう。
作成されたアセットバンドルが更新されていた場合のみに変化する、ちゃんとしたバージョン番号を使えれば良いのですが、Unityの基本的な仕組みではちゃんとしたバージョン番号は生成してくれません。
自分でバージョン管理した番号を自作形式のファイルなどで読み込む必要があるため、宴では基本的にはこのやり方は対応していません。
自作する場合は、後述の自作のファイルマネージャーと宴のファイルマネージャーを組み合わせるを参考にしてください。
キャッシュに有効期限がある
ダウンロード対応する場合は「一度DLしたファイルはキャッシュに残しておいて、二度目はDLしない」という仕組みになっています。
ただし、DLしたアセットバンドルのキャッシュには有効期限があります。デフォルトでは150日です。
古いキャッシュファイルが上書きされずに残る
新しいバージョンのファイルをDLした場合、古いバージョンのファイルは上書きや削除をされずにキャッシュ内に残ります。
そのためアセットバンドルのバージョンアップを繰り返すたびに、キャッシュ全体のサイズが増えていく・・・といった現象が起きます。キャッシュ全体の上限はデフォルトで4Gです。
暗号化はされない。
アセットバンドルに限らずですが、Unityは基本的には暗号化の仕組みがありません。
圧縮・符号化はされているので、ファイルがそのまま丸見えということはないのですが、暗号化などのセキュアな仕組みはありません。
WebGLの場合、キャッシュを使うと起動に長時間かかる
WebGLでもキャッシュを使ったDLが可能なのですが、WebGLでキャッシュを使う場合はファイル数が多いと起動に長時間かかるようです。
WebGLは今のところ、キャッシュを使わないほうが良いようです。
(UnityのWebGLはモバイルでは非対応のため、モバイルのパケット対策は想定しない前提です)
キャッシュを使わないようにするには、WebGLであればStreamigAssetsからロードする仕組みで作って、StreamigAssetsごとサーバーにおくだけです。
これで「必要になったときにファイルをDLしキャッシュは使わない」という形になります。
自作のファイルマネージャーと宴のファイルマネージャーを組み合わせる
上記のようなアセットバンドルにまつわる問題は、宴ではなくUnityの仕様なので基本的には改善できません。
やるとすれば、自力でアセットバンドルのキャッシュの仕組みを作るしかありません。
このケースというのは、宴で用意するアセットバンドル管理システムは使わずに、独自の管理システムを使う必要があるケースになるかと思います。
そういった場合は、こちらの要領でカスタムするプログラムを書いてください
その他、アプリサイズの削減のために
アプリサイズを削減するためには上記のようにアセットバンドルを使うのが有効です。
他にもいくつかの点をチェックすることで、アプリのファイルサイズを抑えることができます。
テクスチャをダイシング化する
宴3から利用可能になったダイシングを使うと、
ノベルゲームにありがちな「表情差分などのちょっとした違いしかなテクスチャ」をまとめて1つのテクスチャにできます。
大幅にファイルサイズを抑えることができるほか使用メモリも抑えられるのでアプリ全体のパフォーマンスが向上します。
不要なファイルを置かないようにする
ビルド対象とするシーン内にからリンクされるチェックし、余計なファイルがあればシーン内からの参照を削除します。
サンプルのリソースを外す
Resources以下やStreamingAssets以下にある余計なリソースは削除する。
特に、宴をはじめアセットストアで購入したアセットのサンプルなどでResourcesフォルダを使っているものがある場合は
使っていなければ、削除するかResourcesフォルダをリネームしてビルド対象から外すようにしましょう。
宴のサンプルのResourcesフォルダは、残ったままビルドすると警告を出すようにしています。
ただし、Utage/Resources/Utage-Shader フォルダ以下には表示に必要なシェーダーがあるので、
こちらは、Resourcesというフォルダ名を変更したりResources以下から移動しないでください。
ビルドしたあとに、表示ができなくなってしまいます。
アセットバンドル化したら、元になるリソースを外す
また、アセットバンドルを使ってDLやStreamigAssetsからデータをロードするようにした場合は、
元となるオリジナルのデータをResources以下に置きっぱなしにすると、アプリサイズが減らずに元のままになってしまいます。
Resourcesフォルダをリネームするかフォルダ以下にあるリソースを別の場所に移動させましょう。
StreamigAssetsを使ってアセットバンドルをしたら、余計なフォルダを削除する
StreamigAssetsを使ってアセットバンドルを作成した場合は、特にこちらに注意してください
http://madnesslabo.net/utage/?page_id=9379#2
ビルドログをチェック
ビルドした際のログは、Window>Console>左上をクリック>OpenEditorLog から確認することができます。
ビルドが終わったら、余計なファイルが混じっていないかチェックしてみましょう。
シーンにリンクされてるアセットをチェック
プロジェクトウィンドウでアセットを選択して、右クリック>ExportPackageとすると、
全てのスクリプト(プログラム)の他に、選択したアセットから参照してる全てのアセットが表示されます。
これを利用して「シーンを選択→右クリック>ExportPackage」とすると、シーン内に含まれるアセットが確認できます。
余計なアセットがビルドに含まれる場合は、これでどのシーンから参照されているかチェックしてみましょう。
各リソースのインポート設定で(素材の劣化を伴う)圧縮設定をする
宴のリソースは基本的には自動的にリソースのインポート設定をしています。
この設定を外して、インポート設定を手動で行って圧縮設定などをすることで、各素材のファイルサイズを抑えることもできます。
ですが、基本的にはこれは素材の劣化を伴います。
「背景は圧縮するけど、キャラ画像は圧縮しない」などの使い分けをしてみてください。
実際の見た目を確認するのも実機に出してみないとわからないため、結構大変かもしれません。
Unityの基本機能ではあるのですが、宴でノベルゲームを作る場合は基本的には自動設定にまかせて何もせず、いざというときには手動設定をするというほうが楽かと思います。
自動インポート設定は、Tools>Utage>ScenarioDataBuilderから設定のオンオフができます。