非破壊ツールを使ってアバターをAndroid(Quest) Poor以内にする【VRChat】
VRChatのアバターを、各種ツールを使ってUnityだけでAndroid(Quest) Poor以内を目指す記事です。
2024/10/19追記
lilNDMFMeshSimplifierがアップデートにより使いやすくなったため、そちらを使うことを推奨するように記事を書き換えました。
Android Poorを目指す意味
Android基準でPoor以内にすると何がうれしいか?ご紹介します。
スマホ版VRChatでアバターが見えるようになる
Android基準でVery Poorのアバターは、Quest版ではShow Avatarすることで見えるようになりますが、スマホ版(Android, iOS)では表示する手段がありません。
スマホ版のユーザにアバターを見てもらうには、Poor以内にする必要があります。
Quest、スマホのユーザがShow Avatarなしでアバターを表示できる(場合がある)
アバターを見る側のユーザの設定によるのですが、「Poor以内ならShow Avatarなしで表示する」という設定ができます。(デフォルト設定はMedium以内です)
注意事項
衣装の着脱など、ほとんどのアバターギミックはAndroid版では動かなくなると考えてください。
透過表現を使った表情は、透過表現のないものになります。主に、赤面や青ざめなどです。
見た目が劣化します。アバターによりますが、「よく見ると崩れている」~「インポスターよりはマシ」の間になると思ってください。
下準備
リポジトリをVCCに登録しプロジェクトにインポート
下記のパッケージを使うので、VCCにリポジトリを登録し、プロジェクトにインポートしてください。
AAO: Avatar Optimizer ( https://vpm.anatawa12.com/add-repo )
anatawa12's gists pack (AAOと同じリポジトリ)
VRCQuestTools ( https://kurotu.github.io/vpm-repos/vpm.html )
TexTransTool ( https://vpm.rs64.net/add-repo )
Modular Avatar ( https://modular-avatar.nadena.dev/ja )
lilNDMFMeshSimplifier ( lilToonと同じリポジトリ )
普段lilToonを使っていない場合は、こちらから「VCCに追加」をしてlilNDMFMeshSimplifierを入手してください。
その他、必要なパッケージをインポート
新規プロジェクトの場合は、アバター本体とアバターが使っているシェーダーも忘れずにインポートしておいてください。
パフォーマンスランクがわかるように設定
非破壊系ツールはアップロードする又はPlayモードに入るまではアバターに変更を適用しないので、VRChatSDK標準のパフォーマンスランク表示はあてにならなくなります。
そのため、実際のパフォーマンスランクを推定してくれるツールを導入します。
Unity上部のメニューから、
Tools > anatawa12's gist selector
を選択し、出てきたメニューで
ActualPerformanceWindow
にチェックを入れ、「Apply Changes」ボタンを押してください。
Android Poor対応作業
ここからは、改変が終わった状態のアバターがヒエラルキーにある前提で説明をします。
今回は、「しなの」をAndroid Poorにする作業の中でやりかたを説明します。
VRCQuestTools のコンポーネント付与
まずは、VRCQuestToolsを使ってとりあえずのAndroid対応をします。
Unity上部のメニューから、
Tools > VRCQuestTools > Convert Avatar for Android
を選択し、アバター欄にアバターをドラッグ&ドロップしてください。
「変換の設定を始める」というボタンが表示されるので、押してください。
「Network ID Assignerが~」というポップアップが出ます。OKを押してください。
Convert Avatar for Androidウィンドウの真ん中あたりにある「Avatar Dynamics設定」というボタンを押してください。
アバターに使われているPhysBoneやPhysBone Collider、Contactの一覧が表示されます。
一旦「すべて解除」を押してまっさらにしたあと、必要なものを選択してください。
このとき、下部に表示されている推定パフォーマンスランクがVery Poor(赤い丸に!)にならないようにしてください。
終わったら、「適用」ボタンを押してください。この設定はAndroidやiOSでビルドするときにだけ適用されるので、PC版のアバターには影響ありません。
ここまで終わったら、Convert Avatar for Androidウィンドウは閉じてください。
※「変換」ボタンは押さないでください。
一旦、PC版をアップロードしましょう。VRCQuestToolsのNetwork ID Assignerが付いたことで、PC版とAndroid版でPhysBoneが同期されるようになります。
PC版をアップロードしたら、ビルドターゲット(Selected Platform)をAndroidに変更してください。
Androidに変更したら、現状どれくらいのパフォーマンスランクなのか見てみましょう。Playボタンを押すことで、「Actual Perfomance」ウィンドウが出てきます。ウィンドウが出たらPlayモードを終了してください。
AAOで基本的な最適化・軽量化
AAO: Avatar Optimizerを使って、「全体的な最適化」「不要なメッシュの削除」「メッシュの統一」を行いましょう。
まずは、アバター直下に「AAO Trace And Optimize」を付けます。
アバターのインスペクターの一番下に「Add Component」ボタンがあるので、押してください。
付与できるコンポーネントの一覧が出てくるので、「AAO Trace And Optimize」を検索して付けてください。
これだけで、見た目や機能に影響のない範囲で自動的に最適化してくれます。
設定変更は特に必要ないですが、お好みで「MMDワールドとの互換性」のチェックを外してください。MMDワールドに行かないなら不要です。
次に、顔のメッシュから透過表現用のメッシュを削除します。
顔のメッシュのインスペクターを開き、Materialsを見てみましょう。メインの顔と透過表現用の部分でマテリアルを分けているアバターが多いです。今回の場合は、「Shinano_face_alpha」が透過表現用のマテリアルです。
「Add Component」ボタンをクリックし、「AAO Remove Mesy By Mask」を付けてください。
今回は「Element 1」が透過なので、「1番のマテリアルスロットに適用」にチェックを付けましょう。
そうしたら、マスクテクスチャ選択欄が出てくるので、「作成」をクリックしてください。真っ白なテクスチャが保存されます。
今回は、1番のマテリアルスロットをすべて消すため、マスクテクスチャを編集する必要はありません。
削除モードを「Remove White」に変更してください。
これで、顔のメッシュから透過表現を削除できました。
次に、体のメッシュのうち服で隠れる部分を削除します。
体のメッシュのインスペクターを開き、「Add Component」ボタンをクリックし、「AAO Remove Mesy By BlendShape」を付けてください。
体のメッシュに設定されているブレンドシェイプの一覧が表示されるので、服で見えなくなる部分を縮めるブレンドシェイプにチェックを入れていってください。「Preview」ボタンでどこが削られるか見ることができます。
次に、メッシュの統合をします。Android Poorの場合Skinned Meshの数は2個までなので、「顔」「顔以外すべて」の2つに分けます。
ちなみに、今回のしなのさんの場合はアバターにソファが付いているのですが、これは「Skinned Mesh」ではなく「Mesh」として別カウントになるので、統合に含めなくてよいです。
まずは、アバター直下に空のGameObjectをひとつ作って、「MergedMesh」と名前を付けてください。
Add Componentから、「AAO Merge Skinned Mesh」を付けてください。
そうすると、「Skinned Mesh Renderer」と「AAO Merge Skinned Mesh」の2つのコンポーネントが付きます。
そうしたら、Skinned Mesh Rendererの「Bounds」「Root Bone」「Anchor Override」の3つを設定します。
服や髪など、他のメッシュに設定されている値をそのまま設定すればよいです。
次に、どのメッシュを統合するか決めます。
まずは、MergedMeshのインスペクターの右上の鍵アイコンをクリックしてください。インスペクターが固定されます。
そうしたら、ヒエラルキーからBody以外のすべてのメッシュを選択し、「スキンメッシュレンダラー」の「追加する要素」にドラッグ&ドロップしましょう。
ただし、今回のしなのさんの場合は、「Cloth_under_bra」「Cloth_under_shorts」「Hair_base」「Other_sofa」は統合対象にしません。
「Cloth_under_bra」「Cloth_under_shorts」は、服で隠れているので後ほど丸ごと無効化します。
「Hair_base」は、他の髪で隠れているので後ほど丸ごと無効化します。
「Other_sofa」は「Skinned Mesh」ではないので統合しなくてもPoorにできます。
ここまでやったら、AAOでの対応は終わりです。
Android版で使わないオブジェクトの無効化
先ほど少し言及しましたが、服や髪で隠れるので見えないオブジェクトを削除します。
「Cloth_under_bra」「Cloth_under_shorts」「Hair_base」に、Add Componentから「VQT Platform GameObject Remover」を付けてください。
付けたら、「Androidで維持」のチェックボックスを外してください。
TexTransToolでマテリアルの統合
Material Slots数を4個以下に減らします。
まずは、アバター直下に空のGameObjectをひとつ作って、「Atlas」と名前を付けてください。
次に、Add Componentから「TTT Atlas Texture」と「VQT Platform GameObject Remover」を付けてください。
そうしたら、TTT Atlas Textureの「TargetRoot」にアバターをドラッグ&ドロップしてください。
アバターに含まれるマテリアルの一覧が表示されるので、先ほど丸ごと使わないことにした透過表現用のマテリアル(ここではShinano_face_alpha)以外のすべてを選択してください。
このコンポーネントが参照するためのダミーのToonlitマテリアルを作ります。
Assets配下の適当な場所で右クリックし、
Create > Material
を選び、マテリアルをひとつ作りましょう。とりあえず「Toonlit_Dummy」と名前を付けてください。
今作ったToonlit_Dummyマテリアルをクリックし、インスペクターからシェーダーをToonlitに変更しておいてください。テクスチャなどの設定は不要です。
Atlasオブジェクトに戻りましょう。
AtlasSettingsで、「MaterialMerge」のチェックをつけてください。
そうすると「PropertyBakeSetting」と「MergeReferenceMaterial」が出てくるので、それぞれ「Bake」「Toonlit_Dummy(さきほど作ったマテリアル)」に設定してください。
また、その下の「ForceSetTexture」にチェックを入れてください。
パフォーマンスランクを見てみましょう。
Material Slotsが3個(顔+ソファ+それ以外)まで減り、残っているVery Poorの項目はポリゴン数だけになりました。
lilNDMFMeshSimplifier(またはMantis LOD Editor)でポリゴン削減
ここからは、lilNDMFMeshSimplifierを使ってポリゴン削減をする方法を説明します。
Mantis LOD Editorを使う場合は、下記の記事に移動してください。
いよいよポリゴン削減です。
うっかりしなのさんを例に選びましたが14万ポリゴンあるのでかなり大変(大幅な妥協が必要)です。
基本的に、もとのポリゴン数が少ないほど2万ポリゴン以下に削ったときのクオリティは高いです。
とにかく、まずはコンポーネントを付けます。
使わないことにした下着などを除くすべてのメッシュオブジェクトについて、Add Componentから「NDMF Mesh Simplifier」と「VQT Platform Component Remover」を付けてください。
ソファにも付けてくださいね。
下記が、NDMF Mesh Simplifierコンポーネントの設定です。
品質(Quality)のスライダーを下げたり上げたりすることで、ポリゴン数を変化させることができます。
例えば、品質0.5なら、そのオブジェクトのポリゴン数が50%になります。
ポリゴン削減するとアバターに一時的に反映されるので、まずは目に見えて劣化する直前まで品質のスライダーを下げてください。
これを、全メッシュオブジェクトで行ってください。
なお、lilNDMFMeshSimplifierのプレビューは非常に重く、スライダーをいじってからプレビューに反映されるまで数秒かかります。また、発生条件はわかりませんが、プレビューに反映されないこともありました。
なかなかプレビューに反映されない場合は、手動でプレビューを更新しましょう。
Unity上部のメニューから
Tools > NDM Framework > Configure Previews
をクリックし、出てきたウィンドウでlilNDMFMeshSimplifierのチェックボックスを一度外し、もう一度チェックをつけてください。プレビューが更新されるかと思います。
品質以外の設定項目のうち「境界エッジを保持」「UVシームのエッジを保持」「UVフォールドオーバーエッジを保持」「表面の曲率を維持」については、チェックボックスを入れたり切ったりすることでどのようにポリゴンを削減するかに変化があります。いろいろいじって最適な設定を見つけてください。(正直、あまりコツはありません。運です……)
全メッシュオブジェクトで上記の作業をしたら、一旦どれくらい削減できたか見てみましょう。Playモードにして、Actual Perfomanceウィンドウを更新してください。
23,796ポリゴンですね。2万以下にするにはあと3,796ポリゴン削る必要があります。
ここからは本当に妥協するしかありません。どのあたりなら崩れていても目立たないか考えながら削っていきます。
場合によっては、AAO Remove Mesy By Maskが使えるかもしれません。
今回でいうと、ドレスの背中側はセーターで隠れるので消せそうです。
Cloth_dressにAAO Remove Mesy By Maskを付けてみます。
Previewボタンを押してプレビューが見えるようにしたあと、マスクテクスチャの「編集」ボタンを押し、編集画面に入りましょう。
セーターやスカートで隠れる部分を塗りつぶしてみました。
ここで注意点がひとつ。
2024/10/19現在のバージョンでは、AAO Remove Mesy By Mask と TTT Atlas Textureの相性が悪く、アトラス化の影響でUVがAAO Remove Mesy By Maskのマスクとずれてしまいます。
なので、AAO Remove Mesy By Maskで指定したマテリアルはTTT Atlas Textureから外すようにしてください。マテリアルスロットは4つになりますが、4つまでならAndroid Poorなのでセーフです。
他にも服で見えなくなる部分をAAO Remove Mesy By Maskで消したり、妥協して品質スライダーを下げたりした結果、なんとか2万ポリゴンに収めることができました。
最後の仕上げで、Android/iOSでアップしたときだけこれらの設定が反映されるように設定します。
さきほど各メッシュに、NDMF Mesh Simplifierと同時に「VQT Platform Component Remover」を付けたはずです。
これらを、PCでは削除するように設定してください。
また、アバターに追加したオブジェクト「MergedMesh」と「Atlas」についても、PCでは反映されないようにします。
これらのオブジェクトにAdd Componentから「VQT Platform GameObject Remover」を付け、「PCで維持」のチェックを外してください。
お疲れ様でした!
これで、Android(Quest) Poor対応は終わりです。Androidビルド(またはiOSビルド)でアップロードして、Questまたはスマートフォンで動作確認してみてください。