【VRChat】VRCで個人的にしているアバター軽量化＆Quest対応術

# はじめに
この記事は、VRChatで自分が個人的に行っている軽量化とQuest対応方法を記事にまとめたものです。そのため、間違いを含んでいる可能性があります。その際は、ご指摘いただけると幸いです。

本記事内では、以下のツールを使用するためあらかじめ導入をお願いします。すべて、VCC経由で導入が可能です。
* lilNDMFMeshSimplifier
* AAO: Avatar Optimizer
* VRCQuestTools
* TexTransTool
* anatawa12's gists pack

# Quest対応
Quest対応は難しいイメージをお持ちかもしれませんが、大事なのは**断捨離の心**です。アバターギミックなどはすべて捨てる覚悟で、割り切ってやっていくのがコツです。

初めに、アバターをunitypackageから導入しHierarchy上に配置しましょう。今回は、ネメシスに対して軽量化を行っていきます。
![スクリーンショット 2025-01-07 160836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/5aef3c83-330c-3e49-a5ca-2978d4ca95f5.png)

### VRCQuestTools
VRCQuestToolsを使用してPhysBone(揺れもの)の削除とシェーダーの変換をしていきます。
Tools -> VRCQuestTools -> Convert Avatar for Androidを選択します。
![スクリーンショット 2025-01-07 161132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/81d6b258-2805-fc71-ee55-465a06119ad3.png)

![スクリーンショット 2025-01-07 161515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/84581766-0c01-d5f9-9c75-691f25aa218d.png)
すると、このような画面が出てくるのでHierarchy上にあるアバターをドラッグアンドドロップし、変換の設定を始めるをクリックします。

![スクリーンショット 2025-01-07 161640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/c7345190-6b38-b845-243b-a4734c594895.png)
Avatar Dynamics設定を開きPhysBoneの無効化を行っていきます。

![スクリーンショット 2025-01-07 162215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/132c3403-9f22-b4a1-2c0a-f57b119e2d09.png)
下に表示されている最大数を超えないように、不要なPhysBoneのチェックを外していきます。参考までに、自分は上の画像ように設定しました。
設定ができたら、下の適応をクリックしてください。その後、元の画面に戻ると思うので、一番下の**手動で変換する**をクリックしてください。

![スクリーンショット 2025-01-07 163304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/407d9709-5eef-6eee-da99-6a8b6dab62db.png)![スクリーンショット 2025-01-07 163518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/503184c7-85b1-62a1-2d29-2bba5db904c2.png)

すると、このようにAndroid対応のオブジェクトが生成されているかと思います。元のオブジェクト(今回だとNemesis)は、UntaggedになっているのでEditorOnlyにしておきましょう。

## 海苔対策
はい、ここまででQuest向けのアップロードができるようになってはいるのですが、悪名高き海苔問題が発生しています。

### Q. 海苔とは
![スクリーンショット 2025-01-07 164040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/e7176944-e739-f14c-d9ae-c07b2073b747.png)
GestureManagerなどで表情を確認すると、**ネメシスちゃんの表情が大変なことに！**
これが通称、海苔。原因はVRC Mobileのシェーダーが透過に対応していないことで起こっています。ということで対策していきます。

### マテリアルの整理
その前にマテリアルの整理をしておきましょう。
![スクリーンショット 2025-01-07 164542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/c57507e2-efac-108b-7484-d64d1e6b979c.png)
![___2025-01-07 164606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/06e526da-d671-f60b-b3a3-5f016f8d119f.png)


顔のマテリアルを見てみると何やら、似たようなマテリアルが。もともとは、アウトライン用などで分割していたのですが、全部VRCのToon Litシェーダーに変換したのでそんなこまごまとした設定は全て吹き飛んでます。無駄にマテリアル数が増えるだけなので、一つにまとめちゃいます。

![スクリーンショット 2025-01-07 165327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/0b8a31ad-ba1f-0bb4-d353-0df96f71cc4a.png)
やり方は簡単で、同じテクスチャが使われてるマテリアルを置き換えるだけです。今回は、Nemesis_FaceOutlineとNemesis_SkinをNemesis_Faceに置き換え、Nemesis_Alpha2をNemesis_Alpha1に置き換えました。
これを顔だけでなく、服や髪などほかの部分についても行っていきます。

### 透過の適応
マテリアルの整理が終わったところで、海苔問題の解決をしていきます。Nemesisの場合は透過テクスチャが単体で存在しているため簡単ですが、存在しない場合はテクスチャの焼きこみ機能を利用して透過テクスチャを自作するか、FaceEmoを用いて表情を変更するなどで対応をお願いします。

![___moz_2025107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/fa9ef112-1c96-3f1e-bb65-739d33d6584a.png)
Alpha用のマテリアルを選択してVRChat -> Mobile -> Particlesに進みます。するとこのように3つシェーダーがあると思うので、自身のアバターに合ったものを選択してください。今回は、Multiplyを使用します。

![スクリーンショット 2025-01-07 170631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/c0950901-0c43-73a1-3ddb-4fe4c3bcbb18.png)
GestureManagerで表情を確認してみると、いい感じになってますね！

# 軽量化
### 現在のパフォーマンスランク
ここから軽量化を行っていきますが、その前に現在のパフォーマンスがどの程度かを調べましょう。そこで活用するのが、anatawa12's gists packです。
![スクリーンショット 2025-01-07 171327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/91700f41-bd0a-a587-bf39-3cfc6ed3e2fd.png)
![スクリーンショット 2025-01-07 171347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/d1451db0-6dd1-7058-8997-1bcb6f671633.png)
Toolsからanatawa12's gists selectorを選択し、ActualPerformanceWindowにチェックを入れてApply Changesをクリックしましょう。
その後、Unityの再生ボタンを押すと現在のパフォーマンスランクを教えてくれます。

![スクリーンショット 2025-01-07 171639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/6f8d4836-349f-6e0b-0e78-935c90f0141a.png)
うーん、みごとにVeryPoor
### AAO Trace And Optimize
ご存じの方も多いかと思いますが、非破壊でなんかいい感じに最適化してくれるTrace And Optimizeコンポーネント！まずはこれをつけていきましょう。

![スクリーンショット 2025-01-07 170928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/380f4b81-1f1a-9940-2672-6c68089a272a.png)
Nemesis(Android)を選択して
![スクリーンショット 2025-01-07 170945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/4867c50f-eff3-62e3-7808-f2c1da72c431.png)
InspectorのAdd ComponentからAAOで検索。
![スクリーンショット 2025-01-07 171016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/e71349d8-facd-bad6-b3c8-b4cfd4ca731c.png)
こうなれば、OK。特に設定などは必要ありません。

### スキンドメッシュの統合
anatawa12's gistsの結果を見てみるとスキンドメッシュがVeryPoorとなっているため統合を行いスキンドメッシュを減らしていきます。

![スクリーンショット 2025-01-07 172802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/484ba001-a7d3-5b84-3741-58853334f53a.png)
まずは、Hierarchy上のアバターの親オブジェクトを選択し右クリック、CreateEmptyを選択します。

![スクリーンショット 2025-01-07 173013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/49eca07e-24b3-6c47-d428-7a8ddbed32e8.png)
すると新たにGameObjectが生成されるため、Add ComponentからAAO Merge Skinned Meshを選択。

![スクリーンショット 2025-01-07 173232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/0f36bded-4338-f60f-5231-08d896010276.png)
スキンドメッシュレンダラーの追加する要素に統合したいオブジェクトを入れていきます。今回は**顔以外**を統合したいと思います。なお、メッシュレンダラーも統合したい場合は下の静的レンダラー内に追加してください。

:::note warn
Skinned Meshを統合するため一部アニメーション等が正常に動作しなくなる可能性があります。
:::

![スクリーンショット 2025-01-07 173916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/fb4f7853-d65f-fafc-3968-503ba648d867.png)
このように設定出来たら、GestureManagerなどで破綻がないかを確認してください。

### テクスチャのアトラス化
TexTransToolを用いてテクスチャのアトラス化を行いマテリアル数の削減を行います。
![スクリーンショット 2025-01-07 174110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/47caf064-39f7-30a2-ffb0-d886712b05ce.png)
まずは、Hierarchy上のアバターの親オブジェクトを選択し右クリック、TexTransTool内のTTT AtlasTextureを選択します。

![スクリーンショット 2025-01-07 174506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/3963a1c5-bf91-44bd-707c-e96046ef8942.png)

すると、AtlasTextureというオブジェクトが生成されるのでここで統合するマテリアルを選択します。
その後、**MaterialMergeにチェック**を入れ**PropertyBakeSettingをBake**にします。MergeReferenceMaterialには統合するマテリアル、今回は顔のマテリアルを選択してます。
最後に、**ForceSetTextureにチェック**を入れ完了です。
GestureManagerなどで破綻がないかを確認しましょう。

:::note warn
警告
透過用のマテリアルは選択しないでください。海苔問題が再発します。
:::

### ポリゴン数の削減
最後にポリゴン数の削減をしていきます。ポリゴン削減には非破壊で削減可能なlilNDMFMeshSimplifierを利用します。

![スクリーンショット 2025-01-07 175420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/7b8a5e28-ed31-82bd-f279-97dd5004ec8e.png)
![スクリーンショット 2025-01-07 175512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/2ce2819e-326c-30c5-9896-db93d29b2a42.png)
ポリゴンを削減したいオブジェクトを選択しAdd ComponentからNDMFMeshSimplifierを追加します。品質のつまみを0に近づける程ポリゴンは少なくなります。品質については、どこまで許容できるかの好みになるのでいろいろと調整してみてください。
このコンポーネントを用いて、服や髪、ボディのポリゴンを削減していきましょう。

![スクリーンショット 2025-01-07 180221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/23f140d6-597a-8eea-4ab4-4ce09130050b.png)

というわけで、最終的にはこのくらい軽量化できました！

# ビルド & アップロード
最後にアップロードを行いましょう。この辺りは、好みですが自分の場合はWindows用でビルドしちゃいます。
![スクリーンショット 2025-01-07 182052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/4afc0759-0815-a32f-d7be-1ae6aaaa5c4b.png)
チェックを入れて、Build & Publish
![スクリーンショット 2025-01-07 182716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/2771fcea-db67-7747-6353-5cb92c27760a.png)

次にプラットフォームをアンドロイドに変更しますが、自分の環境だとなぜかエラーが出ちゃいます。
![スクリーンショット 2025-01-07 182434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271913/3fe300ef-cda9-3c1a-7a50-d8caef0b9127.png)

このエラーは一度unityを落として、起動。セーフモードで起動するか聞かれるのでIgnore(無視)を選択します。
起動した後、再生ボタンを押すとなぜか消えます。
最後に、AndroidでもBuild & Publishを行い完了です。

# おわりに
個人的な備忘録もかねての記事作成となりましたが、Quest対応や軽量化に挑戦する方々の役に立てたのなら幸いです。素人ゆえに、つたない部分もあるかとは存じますがもし修正点等あればご指摘いただけると幸いです。
無理のない軽量化でよいVRCライフを送りましょう！