テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】ノードベースでAssetBundleを作成するツール AssetBundleGraphTool が予想以上に高機能

f:id:tsubaki_t1:20170325120738j:plain

今回はAssetBundleをグラフィカルに生成するAssetBundleGraphToolについて紹介します。

AssetBundleGraphTool

AssetBundleGraphToolは、Unity上でAssetBundleをGUIベースで作る事の出来るアセットです。スクリプトを書かずノードを繋げるだけでAssetBundleが構築出来ます

f:id:tsubaki_t1:20170325124540j:plain

また昔のソシャゲでよく見かけた1Asset1AssetBundleのような大量のアセットから大量のAssetBundleを作りやすい設計になっています。

同時に一々AssetBundle nameを設定しないのでも良いので、大量に生成する際のGUI的な手間が無く、メタファイルを操作しないのでコンフリクトを起こしにくい点が利点です。

  • ノーコーディングでAssetBundle構築
  • 任意のパターンでAssetBundleを構築するケースに便利
  • AssetBundle nameを変更せずとも使える

f:id:tsubaki_t1:20170322072225j:plain

 

ただし、AssetBundle nameを使用しないため、AssetBundleManagerのようなAsset Bundle SimulatorのようなAssetBundleを構築せずゲームを速やかにアセットの変更結果を確認する仕組みが使えません
このため、ステージやキャラクターやギミック等の情報をAssetBundleに格納し動作をするタイプのゲームでは、CI等の仕組みでAssetBundleの構築が完了するまで待つか(場合によっては数時間から半日)、動作を確認するためのワークフローを別途用意する必要があります。

tsubakit1.hateblo.jp

 

現状、個人的には、ユニークな物(ステージやUIのプレハブ)はシミュレータがある為AssetBundleManager、大量生産する物(キャラクターアイコンやモデル、アニメーション等)はAssetBundleGraphToolが向いてるかなというイメージです。

 

なお、古いバージョンではAssetBundleGraphToolでは大量(数千から数万)のアセットから構築する場合には重かったらしいですが、これは既に修正済みだそうです。
(最適化されるのはUnity 5.4.3以降)

入手

下のURLから入手出来ます。

Unity-Technologies / AssetBundleGraphTool / source / — Bitbucket

ちなみにgithubにもAssetGraphToolという物がありますが、こちらは古いです。

基本は絞込と構築、あと生成

AssetBundleGraphToolですが、基本的に絞込構築生成の3つの手順でAssetBundleを生成しています。

  1. AssetBundleに含めたいアセットをプロジェクトから検索し、条件を絞り込む
  2. 絞り込んだアセット群を元にグループを構築する
  3. グループを元にAssetBundleを生成

f:id:tsubaki_t1:20170325123943j:plain

アセットの絞り込み

AssetBundleに格納するアセットの絞り込みですが、フォルダ単位だけでなく、ワイルドカード正規表現を用いたファイル名検索や、アセットのタイプ指定も可能です。

下のようなフォルダ構成だった場合、各キャラクター毎にAssetBundleを生成できるようにしてみます。

f:id:tsubaki_t1:20170325104644j:plain

まず最初の状態です。

コレが今まで通りの「フォルダ・アセットにassetbundle nameを指定」しています。この場合、prefabフォルダ以下のアセット全てをprefab化しようとしています。

f:id:tsubaki_t1:20170325102459p:plain

上では指定のフォルダから全部取ってきてしまっていますが、次はファイル名(やタイプ)でプレハブを抽出してみます。

例えば下の場合、Prefabフォルダに格納されている「utc」の名前を持つprefabを抽出し、それぞれAssetBundleを構築してみます。
utcのファイル名を含むprefabは2つなので、2つのprefabがassetbundleに含まれます。

f:id:tsubaki_t1:20170325104917j:plain

一つのフォルダから複数の物を取り出す事も出来ます。下の画像では、キャラクター毎にAssetBundleを構築しています。

f:id:tsubaki_t1:20170325104355j:plain

グルーピングで、条件毎にAssetBundleのグループを構築

上ではキャラクター毎にassetbundleの生成ノードを設定しましたが、キャラクターが増えていくと面倒になりそうなのは目に見えています。

なので、条件に従ったグループ化を行います。

f:id:tsubaki_t1:20170325105409j:plain

グループ化はワイルドカード(もしくは正規表現)で行います。一つ目のワイルドカードを元にグルーピングしてくれる感じです。

例えば下のようなプレハブがあった場合

  • Character_yuko_summer.prefab
  • Character_yuko_winter.prefab
  •  Character_misaki_summer.prefab
  •  Character_misaki_winter.prefab
  • Character_utc_summer.prefab
  • Character_utc_winter.prefab

この場合は Character_*_*.prefab のようなワイルドカードをセットしておくと、yukomisakiutcで自動的にグループ化を行い、それぞれのAssetBundleを作ってくれるように出来ます。

下画像の右を見ると、各prefabがキャラクターのタイプ毎にグルーピングされています。

f:id:tsubaki_t1:20170325112733j:plain

生成結果はこんな感じ。各AssetBundleにSummerとWinterのプレハブが含まれます。

f:id:tsubaki_t1:20170325114914j:plain

AssetBundleの設定と生成と

作ったAssetBundle達を生成するのもノードベースです。

チェックを入れるだけでAssetBundleのオプションが選択出来たり、プラットフォーム毎にAssetBundleを出力するフォルダを選べたりします。

f:id:tsubaki_t1:20170325122615j:plain

AssetBundleに含めるアセットをプラットフォーム毎に分ける

AssetBundle Graphtoolで個人的にクールだと思う機能が、プラットフォーム毎に含めるアセットを分ける事ができる機能です。

例えばAssetBundleに含めるアセットを探すフォルダを指定する機能ですが、プラットフォームにどのフォルダを探すのかを指定することが出来ます。

後は指定プラットフォーム毎にPrefabやShader等を設定しておけば、AssetBundleで一気に出力出来ます。

f:id:tsubaki_t1:20170325113051j:plain

f:id:tsubaki_t1:20170325122323j:plain

f:id:tsubaki_t1:20170325121845j:plain

これAssetBundleシミュレーターと組み合わせられれば凄い便利だったんですが…

その他

他にも、

  • コマンドライン実行
  • ノードでPrefabやアセットの生成する(スクリプト
  • グルーピングのルールを作成(スクリプト
  • 各ノードの機能をカスタマイズしたノードを作成(スクリプト
  • テクスチャ設定やモデルの設定の更新
  • AssetBundle間で重複するアセットがあれば抽出し別AssetBundle化

等、色々と面白い使い方がありますが、長くなりすぎるのでまた今度。

f:id:tsubaki_t1:20170325114643j:plain

次は簡単な使い方について紹介したい所。

 

なお、今回の記事はAssetBundleGraphTool 1.2です。
つまりソースコードのを直接取得したバージョンの動作です。

「ダウンロード」から取得した物は1.1と、機能やUIが少し異なるので注意。

関連

AssetBundleGraphToolのサンプル

AssetBundleGraph作ってみた 気持ち全国から選りすぐりのサンプル集を大公開!

 

blogs.unity3d.com

tsubakit1.hateblo.jp

github.com

【Unity】CUIで行こう

f:id:tsubaki_t1:20170324005916j:plain

ふと「Unityの操作はGUIがタルい」という話を耳にした。

宜しい、ならばCUI

 

コマンドラインでいこう

まぁCUIといったらコマンドラインでしょう。

マニュアルを見ると、意外とコマンドラインはあります。

docs.unity3d.com

-batchと -quitと -nographicsは友達

全部CUIで頑張ろうと思った時に頼りになるのが、-batchと-quitと-nographicsです。

-batchはUnityエディタのウィンドウを表示せず、

-quitは操作が完了したらUnityエディタ(サービス)を落とし、

-nographicsはグラフィックを起動しない。

フレンズ。

プロジェクトを作ろう

コマンドラインの -createProject でプロジェクトを作ります。

f:id:tsubaki_t1:20170324010013j:plain

ソースコードやアセット群を用意しよう

プロジェクトだけではゲームは作れないので、ソースコードを用意。

勿論コマンドラインで。

置いただけではすぐに使えないので、バッチモードで一瞬だけUnityを起動して、メタデータを作ってもらいます。

 

基本的にアセット群はResourcesもしくはAssetBundleから取得する感じになります。

 

ソースコードを編集しよう

入力補完は甘え

男は黙って…何使うんでしょうね。vim?

 

あ、外部にC#ライブラリプロジェクト作って(unityengine.dll参照して)assets以下にビルドするのは有りだと思います。

 

まぁ、基本的にMonobehaviourは1個で、そこに処理を追加する流れになりそうです。
(自分の場合はMainコンポーネント一つだけ)
画像の表現等はGraphics系命令で何とか。アニメーションはPlayableAPI
 

シーンビューに物を置こう

シーンビューに物を置く系の操作はエディタを操作しないといけませんが、エディタ拡張でやってしまいます。

エディタ拡張のメソッドを定義し、コマンドラインの -executeMethod で呼び出す感じです。

Mainコンポーネントを用意しておき、シーンにMainコンポーネントだけ配置、今後はMainコンポーネントにコードを記述していきます。

gist.github.com

ちなみにCameraは初期設定では無いので、Mainコンポーネントから追加が必要。

ゲームを試そう

Unityエディタのシミュレーターが使えないので、毎回ビルドします。
これで無限ループ起こしても安心。

コマンドは -buildWindows64Player とか使います。

上手く行けば実行ファイルが作られます。

f:id:tsubaki_t1:20170324010654j:plain

 

感想

冗談でやったけど、自分には無理だなぁ

 

大昔にCUI操作を積極的に行っていた時期がありましたが、正直GUIの方が最終的に操作時間が短く済んだという記憶があったりなかったり。
幾つかのコマンドは便利だったという記憶はありますが。

 

その他

そういえば、何時の間にかハンドル渡せるようになったんですね。
お陰でコレが出来ました。

 

【Unity】ゲームに最初から含めるアセット群を圧縮するオプション

Unity 5.6から、ビルドしたゲームに含めるアセット群を圧縮するオプションが追加されました。

この圧縮をONにすることで「アプリ起動時間の短縮」「インストール後にサイズが膨れ上がるのを防ぐ(iOS/Standalone)」効果が期待出来ます。

ビルドしたゲームに含めるアセット

Unityは、ゲームに含めたシーンやResourcesから参照しているアセット群は、ゲームビルド時にゲームに含めます(参照されていなければ含まれません)

含まれるアセットは基本的にそのまま保持されます。たとえば、RGBA32のような非圧縮画像の場合、全く圧縮されず非常に大きなサイズとなってアプリに反映されます。

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20160505/20160505230835.jpg

tsubakit1.hateblo.jp

アセット群を圧縮するオプション

Playerのアセットを圧縮するには、BuildPipelineのBuildPlayerにて、BuildOptions.CompressWithLz4を有効にするだけです。

5.6では、BuildPipeline.BuildPlayerのコードを記述する必要があります。

gist.github.com

2017.2からBuild Settingsで設定できるようになったみたいです。

f:id:tsubaki_t1:20170926094742j:plain

起動時間が早くなる

 これの良いと思う所は、単純に起動が早くなる事です。

 実際に比較すると、圧縮前は1.44秒かかっていた起動が、圧縮後は0.54秒で完了し起動しています。

 正確には、アプリに含まれる巨大なアセットを遅いIOからロードするより、CPUが早いので圧縮したアセットから取り出して解凍した方が早くなった…という感じな気がします。
もしかしたらIOアクセスが早くなるらしい最新のiOSでは、余り変わらないかもしれません。

 

まぁ、ソレ以外にも5.6で色々とロードパフォーマンス改善してる気がしなくもないです…IL2CPPにするとMonoより起動が早くなるとかも含めて。

 

インストール後のサイズが減る。apkやipa時は余り変わらず

さてandroidiOSのアプリサイズとして気になるのは、リリース時のアプリサイズだと思いますが、こちらは残念ながらほぼ変わらないです。

 

というのも、ipaやapkは既にzip形式で圧縮されており、いまさら再圧縮した所で対して変わらないどころか、場合によっては増えます。

 

ただし、アプリをインストール後は話は別です。Androidは対して変わらないのですが、iOSの場合インストール後にファイルを解凍します。
そのためiOSはアプリインストール後にファイルサイズが跳ね上がる訳ですが、圧縮オプションではその辺りをかなり緩和してくれます。

 

感想

Resourcesを使わない理由がまた一つ減った感

 

関連

AssetBundleに格納してみた的な

tsubakit1.hateblo.j

【Unity】Video Playerでアルファチャンネル付きムービーを使う

アルファチャンネル付きムービー、アルファムービー、透過ムービー、with alpha、αムービー、Aビデオ、呼び方は色々ありますが、背景が透明なムービーについてです。

f:id:tsubaki_t1:20170320122129g:plain

アルファチャンネル付きムービー

Unity 5.6から導入されたVideo Playerはアルファチャンネル付きムービーもサポートしているみたいです。

画面全体もしくは一部を完璧に覆う訳では無いので、上手く使えば演出等にも使用できそうです。

f:id:tsubaki_t1:20170320122509g:plain

アルファチャンネル付きムービーの扱いは他のVideo Clipと同じですが、一点Keep Alphaという項目が追加されています。

f:id:tsubaki_t1:20170320123306j:plain

使用出来るコーデック

アルファチャンネル付きムービーをググると、RGBA32なAVIや可逆圧縮コーデック等が出てきましたが、UnityではWebm VP8 with alpha*1というコーデックに対応しています。

WebM - Wikipedia

 

他にもApple ProRes 4444なる企画にも対応しているそうですが、今は亡きQuickTimeを要求するので、.webm一択です。

他のコーデックは残念ながら動きませんでした。

Webmを再生出来ない端末では

Webmをサポートしていない端末、例えばモバイル等の環境では、使えるフォーマットに変換してやる必要があります。

具体的には、Keep Alphaのチェックを入れ、Transcodeで変換処理をかけてやると再生出来るようになります。

f:id:tsubaki_t1:20170320124104j:plain

内部的には、アルファ情報を他のチャンネルにこっそり格納し、実行時にシェーダーでマスクをかけるのをやってるっぽいです。

In order to work around the difficulties of using standard clips with alpha in your Unity built game, Unity offers the "Keep Alpha" option in its VideoClip importer. When Unity detects the video has native alpha in it, the Keep Alpha option shows up in the VideoClip importer and if you enable it along with the transcode option, the resulting VideoClip asset will use an internal layout where the alpha is encoded in hidden color channels. During decoding at runtime, we recombine these hidden color channels with the actual color content on the GPU to yield a RGBA movie without needing any special decoding capabilities from the platform.

Settings for importing a video with an alpha channel

 

負荷は未検証ですが、Video Playerが優秀なのか、モバイルでも(画面全体のムービーを)3枚4枚使う分には殆ど問題無いです。ただ(多分フィルレート的に)数十枚使うのはあまり良くないかもしれません。

また、単純にくり抜きたい場合、クロマキーシェーダーを用意して抜き取った方が、データ構造的に楽な気がしなくもないです。

 

またサポートしてない端末では、URLから取得ではなくAssetBundleから取得してストリーム再生した方が色々と楽そうに見えます。

アルファチャンネル付きムービーをサクっと試す

アルファチャンネル付きムービーの動作をサクっと確認します。

  1. Video Playerを用意
  2. SourceをURLに変更
  3. URLの接続先は「http://tsubakit1.sakura.ne.jp/temp/unity_B.webm」とする。
  4. Render ModeはCamera Back Plane(指定カメラの一番奥)
  5. CameraにMain Cameraを設定

f:id:tsubaki_t1:20170320130044g:plain

これでゲーム再生時ムービーが再生されます。

f:id:tsubaki_t1:20170320130604j:plain

もしくは、動画ファイルをhttp://tsubakit1.sakura.ne.jp/temp/unity_B.webmからダウンロードし、Assets以下に配置、Video Clipにドラッグ&ドロップで配置する感じです。

f:id:tsubaki_t1:20170320130817j:plain

アルファチャンネル付きムービーを作る

アルファチャンネル付きムービー、Webm VP8 with alphaを作成してみます。

この手順、ムービーからの一発変換とかクロマキー色抜き取りとか無く、連番ファイルをffmpegで動画にするという、微妙な作業になります。

連番画像を用意する

連番画像を用意します。

今回はUNITY-CHAN! OFFICIAL WEBSITEにあるC88 ユニティちゃん アニメーション素材データを使います。

f:id:tsubaki_t1:20170320131423j:plain

中身はこんな感じの連番画像。命名規則は「B_%5d.png」です。

f:id:tsubaki_t1:20170320131300j:plain

画像変換

まずffmpegをインストールします。

 

次に変換作業。

自分の場合、ffmpeg.exeのフォルダ隣にimagesなるファイルを用意して、そこに連番ファイルをコピーしました。癖です。

コマンドプロンプトを開いて、cd コマンドffmpeg.exeのある位置まで移動します。

f:id:tsubaki_t1:20170320132926j:plain

後は「ffmpeg.exe -i images/B_%5d.png  -auto-alt-ref 0 -c:v libvpx export.webm」のようにコマンドを発行すれば、連番ファイルが動画になります。

赤が書き換えるべき部分、青が固定でも良い部分です。

f:id:tsubaki_t1:20170320132525j:plain

f:id:tsubaki_t1:20170320133107j:plain

関連

qiita.com

forum.unity3d.com

d.hatena.ne.jp

© Unity Technologies Japan/UCL

*1:webmはgoogleがスポンサーをしているロイヤリティフリーのムービーコンテナ