はじめに
この記事は、VRChatで自分が個人的に行っている軽量化とQuest対応方法を記事にまとめたものです。そのため、間違いを含んでいる可能性があります。その際は、ご指摘いただけると幸いです。
本記事内では、以下のツールを使用するためあらかじめ導入をお願いします。すべて、VCC経由で導入が可能です。
- lilNDMFMeshSimplifier
- AAO: Avatar Optimizer
- VRCQuestTools
- TexTransTool
- anatawa12's gists pack
Quest対応
Quest対応は難しいイメージをお持ちかもしれませんが、大事なのは断捨離の心です。アバターギミックなどはすべて捨てる覚悟で、割り切ってやっていくのがコツです。
初めに、アバターをunitypackageから導入しHierarchy上に配置しましょう。今回は、ネメシスに対して軽量化を行っていきます。
VRCQuestTools
VRCQuestToolsを使用してPhysBone(揺れもの)の削除とシェーダーの変換をしていきます。
Tools -> VRCQuestTools -> Convert Avatar for Androidを選択します。
すると、このような画面が出てくるのでHierarchy上にあるアバターをドラッグアンドドロップし、変換の設定を始めるをクリックします。
Avatar Dynamics設定を開きPhysBoneの無効化を行っていきます。
下に表示されている最大数を超えないように、不要なPhysBoneのチェックを外していきます。参考までに、自分は上の画像ように設定しました。
設定ができたら、下の適応をクリックしてください。その後、元の画面に戻ると思うので、一番下の手動で変換するをクリックしてください。
すると、このようにAndroid対応のオブジェクトが生成されているかと思います。元のオブジェクト(今回だとNemesis)は、UntaggedになっているのでEditorOnlyにしておきましょう。
海苔対策
はい、ここまででQuest向けのアップロードができるようになってはいるのですが、悪名高き海苔問題が発生しています。
Q. 海苔とは
GestureManagerなどで表情を確認すると、ネメシスちゃんの表情が大変なことに!
これが通称、海苔。原因はVRC Mobileのシェーダーが透過に対応していないことで起こっています。ということで対策していきます。
マテリアルの整理
顔のマテリアルを見てみると何やら、似たようなマテリアルが。もともとは、アウトライン用などで分割していたのですが、全部VRCのToon Litシェーダーに変換したのでそんなこまごまとした設定は全て吹き飛んでます。無駄にマテリアル数が増えるだけなので、一つにまとめちゃいます。
やり方は簡単で、同じテクスチャが使われてるマテリアルを置き換えるだけです。今回は、Nemesis_FaceOutlineとNemesis_SkinをNemesis_Faceに置き換え、Nemesis_Alpha2をNemesis_Alpha1に置き換えました。
これを顔だけでなく、服や髪などほかの部分についても行っていきます。
透過の適応
マテリアルの整理が終わったところで、海苔問題の解決をしていきます。Nemesisの場合は透過テクスチャが単体で存在しているため簡単ですが、存在しない場合はテクスチャの焼きこみ機能を利用して透過テクスチャを自作するか、FaceEmoを用いて表情を変更するなどで対応をお願いします。
Alpha用のマテリアルを選択してVRChat -> Mobile -> Particlesに進みます。するとこのように3つシェーダーがあると思うので、自身のアバターに合ったものを選択してください。今回は、Multiplyを使用します。
GestureManagerで表情を確認してみると、いい感じになってますね!
軽量化
現在のパフォーマンスランク
ここから軽量化を行っていきますが、その前に現在のパフォーマンスがどの程度かを調べましょう。そこで活用するのが、anatawa12's gists packです。
Toolsからanatawa12's gists selectorを選択し、ActualPerformanceWindowにチェックを入れてApply Changesをクリックしましょう。
その後、Unityの再生ボタンを押すと現在のパフォーマンスランクを教えてくれます。
AAO Trace And Optimize
ご存じの方も多いかと思いますが、非破壊でなんかいい感じに最適化してくれるTrace And Optimizeコンポーネント!まずはこれをつけていきましょう。
Nemesis(Android)を選択して
InspectorのAdd ComponentからAAOで検索。
こうなれば、OK。特に設定などは必要ありません。
スキンドメッシュの統合
anatawa12's gistsの結果を見てみるとスキンドメッシュがVeryPoorとなっているため統合を行いスキンドメッシュを減らしていきます。
まずは、Hierarchy上のアバターの親オブジェクトを選択し右クリック、CreateEmptyを選択します。
すると新たにGameObjectが生成されるため、Add ComponentからAAO Merge Skinned Meshを選択。
スキンドメッシュレンダラーの追加する要素に統合したいオブジェクトを入れていきます。今回は顔以外を統合したいと思います。なお、メッシュレンダラーも統合したい場合は下の静的レンダラー内に追加してください。
Skinned Meshを統合するため一部アニメーション等が正常に動作しなくなる可能性があります。
このように設定出来たら、GestureManagerなどで破綻がないかを確認してください。
テクスチャのアトラス化
TexTransToolを用いてテクスチャのアトラス化を行いマテリアル数の削減を行います。
まずは、Hierarchy上のアバターの親オブジェクトを選択し右クリック、TexTransTool内のTTT AtlasTextureを選択します。
すると、AtlasTextureというオブジェクトが生成されるのでここで統合するマテリアルを選択します。
その後、MaterialMergeにチェックを入れPropertyBakeSettingをBakeにします。MergeReferenceMaterialには統合するマテリアル、今回は顔のマテリアルを選択してます。
最後に、ForceSetTextureにチェックを入れ完了です。
GestureManagerなどで破綻がないかを確認しましょう。
警告
透過用のマテリアルは選択しないでください。海苔問題が再発します。
ポリゴン数の削減
最後にポリゴン数の削減をしていきます。ポリゴン削減には非破壊で削減可能なlilNDMFMeshSimplifierを利用します。
ポリゴンを削減したいオブジェクトを選択しAdd ComponentからNDMFMeshSimplifierを追加します。品質のつまみを0に近づける程ポリゴンは少なくなります。品質については、どこまで許容できるかの好みになるのでいろいろと調整してみてください。
このコンポーネントを用いて、服や髪、ボディのポリゴンを削減していきましょう。
というわけで、最終的にはこのくらい軽量化できました!
ビルド & アップロード
最後にアップロードを行いましょう。この辺りは、好みですが自分の場合はWindows用でビルドしちゃいます。
チェックを入れて、Build & Publish
次にプラットフォームをアンドロイドに変更しますが、自分の環境だとなぜかエラーが出ちゃいます。
このエラーは一度unityを落として、起動。セーフモードで起動するか聞かれるのでIgnore(無視)を選択します。
起動した後、再生ボタンを押すとなぜか消えます。
最後に、AndroidでもBuild & Publishを行い完了です。
おわりに
個人的な備忘録もかねての記事作成となりましたが、Quest対応や軽量化に挑戦する方々の役に立てたのなら幸いです。素人ゆえに、つたない部分もあるかとは存じますがもし修正点等あればご指摘いただけると幸いです。
無理のない軽量化でよいVRCライフを送りましょう!