【VRChat】俺のアバターQuest(モバイル)対応晒す
こんにちは。
帰省中先からPCVRでVRChatへ入るためにGPUボックスを持ち込む覚悟をしたambrサーバーサイドエンジニアの回路(@qazx7412)です。
さて突然ですが皆さんQuest対応もといAndroid対応もといモバイル対応はやってらっしゃいますでしょうか?
VRChatをやっていて頭の痛い問題のひとつといえばQuest対応だと思います。
流石にきれいな作りでAndroid Goodまで対応してフォールバックに設定できるようにというところまでは難しいですが、比較的軽めのアバターを最低限のクオリティでAndroid Poorにして非PCユーザーにも見えるようにするというところであればそこまで無理なく実現可能です。
ということで今回は私がアバターのモバイル対応で普段やっていることを忘備録的にまとめさせていただきます。
前提(使用ツール)
今回の記事では下記のツールを使用します。
- AAO: Avatar Optimizer
- VRCQuestTools
- TexTransTool
動作確認のために更に下記を導入しています。
- anatawa12's gists pack
- ActualPerformanceWindow
- Gesture Manager
それぞれVCCを使用して導入しましょう。
またあくまでこれは私の場合こうやっているという話なので必ずしも最適解ではないということはご了承願います。
PC版でもやるやつ
ではまずPC、モバイル問わず対応するものから紹介しましょう。
AAO: Avatar Optimizer
まずアバターのモバイル対応の定番といえばAvatar Optimizer。
この記事でも軽量化対応のうち多くはこれを使います。
Trace And Optimize
まずはおなじみなんかいれると軽くしてくれるやつです。
アバタールートに適当に入れてやるとそれだけで自動で最適化してくれます。
不具合がない限り、入れない理由がないので入れましょう。

念の為、アバタールートはここです。

Remove Mesh By Box
エディター上で箱を設定するとその範囲内のメッシュを削除できます。
脱ぐことや透けることを想定した衣装でなけれな下に肌が存在する必要は基本的にはないのでこれで服の下をすべて消してしまいます。
正直見えないところを消すだけなので、実のところ Remove Mesh By XXX のうちどれを使用しても構いません。自分が使いやすいものを使いましょう。
私の場合はクリエイター向けのツールを使い慣れていないのと操作が直感的なのでBoxを使用しています。
メッシュ削減したいパーツに設定して、右の入力欄から個数を設定し、Edit This Boxを押下すると編集モードに入ります。

画像の例だと顔と手以外バッサリ消してます。
長袖長ズボンで肌が見えない衣装であれば、さっくりとしたサイズ合わせだけで非対応衣装を着せたりするのにも使えるので是非活用しましょう。

モバイル対応
では本題のモバイル対応に入って行きます。
VRCQuestTools
まずはPC向けのアバターをモバイル向けに変換します。
変換にはVRCQuestTools使います。これも定番のやつですね。
導入ができていれば、Tools > VRCQuestTools > Convert Avatar for Androidから変換用メニューに入れます。

開いたらアバターから変換したいアバターを選択しましょう。
(画像の都合上変換後のものが表示されていますが一旦見なかったことに…)

最後に一番下の手動で変換するから実行しましょう。
そうすると、アバター名の後ろに(Android)とついたPrefabが作成されるはずです。
また揺れものに関してこだわりたい場合は、ここでどのPhysBoneを残すかという設定が必要ですが、今回はあくまでクオリティを妥協する前提であるのでここでは割愛とさせていただきます。
ちなみに最新版のVRCQuestToolsにはAvatar Builderという機能があり、自動変換からアップロードまでを自動で行うことができます。
スペック的にVeryPoorを許容(スマホ非対応、QuestでもShow Avatar必須かつおそらく高負荷)したり、後述する手動対応が必要な問題を諦めるならばこれでアップロードまでしてしまって構いません。
プラットフォームの切り替えだけすれば他を意識することなく対応できるのでとても便利です。

備考: 手動対応が必要なものについて
個々のアバターによって事情が違うので一般化できませんが、一部VRCQuestToolsでの変換のあと手動で対応が必要なものもあります。
例えばよく起こる問題としては透過表現を使用した表情などが想定通り動作しないことがあります。
これは変換後に使用されるToon Litというシェーダーが透過表現を許容しないからです。
対処法もそれぞれではありますが、私の場合はある程度クオリティの低下を許容する前提で対応しているのでBody(顔)から対象のマテリアルを消してしまって対応することが多いです。
もちろんこれは私の使用しているアバターがたまたまそれで他の問題を起こさない作りであったからできることなので、それぞれのアバターに応じて対応をしましょう。
AAO: Avatar Optimizer(モバイル側)
PC版の時に使用したAvatar Optimizerですが、モバイル用に変換したものでは追加で対応します。
Merge Skinned Mesh
スキンメッシュを統合できる機能です。
PC版の範囲であればTrace And Optimizeの自動処理の範囲で十分なのですが、モバイルの場合は制限が厳しいので手動で設定し、顔とそれ以外でそれぞれマテリアルの統合します。
まずアバタールートにCreate Emptyから新しいGameObjectを2つ作成します。

作成したら任意のわかりやすい名前をつけましょう。
私の場合は、全身用をAAOと顔用をAAO_bodyで作成しています。
まず全身用を作成してMerge Skinned Meshをアタッチしたら、スキンメッシュレンダラーに顔以外のすべての要素を追加します。
(Inspectorを右上の鍵マークでロックしてからエディターから一括で選択するとやりやすいです)

同じことを顔用のGameObjectでも実行します。
TexTransTool
次にテクスチャの統合と容量削減します。
TexTransToolはテクスチャ周りの対応を非破壊で実行できる便利なツールです。
AtlasTexture
Merge Skinned Meshの時と同じように全身用と顔用にGameObjectを2つ作成します。
例の如く私は全身用をTTTと顔用をTTT_bodyで作成しています。
全身用を作成したらTargetから顔以外のマテリアルをすべて選択、AtlasTextureSizeでテクスチャのサイズを設定(モバイル対応なら1024で十分なはず…)MaterialMergeにチェックを入れます。

同じことを顔用のGameObjectでも実行します。
lilNDMFMeshSimplifier
最後にポリゴン削減をします。
lilNDMFMeshSimplifierは比較的新しいツールなのですが、アタッチしたオブジェクトのポリゴンを削減できるツールです。
やり方は簡単で、削減したいオブジェクトにNDMF Mesh Simplifierをアタッチして設定をするだけです。

ただ当然問題はどういった設定するかになります。…がこれは残念ながら決まった正解はありません。
アバターや衣装、目指すクオリティに応じて頑張って設定を模索しましょう。
動作チェック
一通り完成した、または途中で確認したくなった場合は動作チェックをしましょう。
基本的にアバターのチェックをしたい場合はUnityのプレイヤーを実行してしまえばチェックできます。
ただ、当然アバターのパフォーマンスがどうなっているかや動作をさせて破綻がないかチェックしたいという需要があると思うのでツールをそのためのツールを使ってチェックをします。
ActualPerformanceWindow(anatawa12's gists pack)
アバターのパフォーマンスをチェックするにはanatawa12's gists packで導入できるActualPerformanceWindowを使用します。
Tools > anatawa12's gist selectorからActualPerformanceWindowを選択してApplyを押すと導入できます。


あとはプレイヤーを実行すればアバターのパフォーマンスを計測するウィンドウが表示されます。

Gesture Manager
簡易的にアバターの動作チェックができるツールです。
Tools > Gesture Manager Emulatorを実行するとGestureManagerというオブジェクトが作成されるので、GestureManagerのEnter Play-Modeを押下するとプレイヤーが実行されます。

実行するとメニューなどが表示されるのでここからいい感じに動かしてみて破綻がないかチェックしてみましょう。
ただあくまで本格的に破綻をチェックする場合は、Questなどから実機でチェックすることを推奨します。

アップロード
すべて完了したらアップロードをして完了です。
お疲れさまでした。
最後にちょっと古いのですが、私が過去に対応した時の画像が残っていたのでお見せいたします。
Discussion