はじめに
- この記事では、Avatar Makerで作成したアバターを、UnityだけでMobile対応(Quest、Android、iOS対応)させてVRChatにアップロードするのを目指します。
- 本記事ではパフォーマンスランクPoorを目指していますが、Mediumを目指す場合でも応用できます。
- Avatar MakerにはアバターをVRChatに直接アップロードする有料のプランが存在しています。アイテムに制限はありますが、この方法であればPCを持っていなくてもアバターをアップロードできますので、Unityでの編集が難しい方はそちらをご検討ください。
- 筆者はiOS環境がないため、iOSの動作は未確認です。
作成履歴
注意点
- 2025年11月4日時点の内容ですが、古い情報が元になっていたり、私が知らない故に無駄な作業をしている箇所があるかも知れません
- 本記事作成時点の環境は以下の通りです
| アセット等 |
バージョン |
| Unity |
2022.3.22f1 |
| VRChat SDK - Avatars |
3.9.0 |
| AAO: Avatar Optimizer |
1.8.14 |
| Modular Avatar |
1.14.3 |
| TexTransTool |
1.0.0 |
| Meshia Mesh Simplification |
3.0.0 |
- UnityやVCCのインストールなど、VRChatにアバターをアップロードするための最初期の環境構築については省略しています
目指すべき指標
Avatar Makerでアバターを作る前に、Mobile(Quest、Android、iOS)版VRChatの基本的な仕様をおさらいしましょう。
- パフォーマンスランクによる表示制限の初期値は「Medium以下」。ただし「Poor以下」に変更可能。
- Very Poorは4体までであれば手動で表示することができる(いわゆるShow Avatar)。(自分のアバターがVeryPoorの場合は自動で表示)
- 将来的に上記のVery Poorの表示機能は削除される可能性がある(公式から案内されていますが、今後の取り扱いが変化する可能性はあると思っています(インポスターシステムの実装や、端末側の平均的なスペックの上昇等)
)
ということで、現時点におけるモバイル向けアバターの目標は、操作なしで表示できるMediumか、一度設定を変更すれば恒久的に有効なPoorを目指すことになります。
そして、Avatar Makerのアバターを使う場合、もっともパフォーマンスランクに影響を与えるのはポリゴン数であり、このポリゴン数の削減はUnityでは大変ですので、ひとまずアバターを作ってみて、そのポリゴン数を元に目指すべきパフォーマンスランクを設定するといいでしょう。
編集に使うアバターの紹介
もちろん、Avatar Makerで作ったアバターを使用します。

Avatar Makerのプリセット衣装や顔のパーツは特徴的なものが多く、組み合わせるのが難しかった、というのがサービス開始当初に触ってみた感想です。
しかし、最近ではVRChat向けアバターのAvatar Maker版が登場したり、幾つかのパーツが追加されたりして、だいぶ使い勝手がよくなっていると思います。
写真はVRChat向けアバターのシアンからAvatar Makerに移植されたパーツを主体に作った私のアバターです。
似たようなことができるサービスにVRoid Studioがありますが、編集の自由度はVRoid Studio、モバイル対応の簡便さはAvatar
Makerに軍配が上がります(Avatar Makerはモバイル対応で最大の課題となるカットアウトを使用していないため)。
Avatar Makerでアバターを作る
基本的には好きに作ってかまいません。
しかし、ポリゴン数という壁が最後に立ちはだかりますので、好みのアバターを作ってから目標とするパフォーマンスランクを決めるか、一度作ってみてから目標とするパフォーマンスランクを決めるのがいいでしょう。
1万5000ポリゴン前後ならMedium、2万ポリゴン前後ならPoorが視野に入ってきます。また、頑張ってツールを使ってポリゴン数を減らすよりは、使う髪型やパーツ選びで減らす方が簡単ですので、そのことを念頭に置いておきましょう。体感、10%程度であればツールで無理なくポリゴン数を削れるイメージです。この記事の終盤で、基準を多少オーバーしているポリゴンを削減する話も出てきますので、それを参考にしてもいいでしょう。

早速作ってみましたが、今回は2万0967ポリゴンになりましたのでPoorを目指すことにします。Avatar Makerはリアルタイムでポリゴン数が出るので、この辺の調整が本当に楽です。
アバターを作り終えたら「アバター管理」から「Unity Packageをリクエスト」します。

アバター管理画面からダウンロードしたいアバターの「ダウンロード」をクリック。

表示されたメニューから「Unity Packageリクエスト」を選択します。

サーバー側でUnitypackageが生成され、ダウンロードできるようになるとメールが届きますので、早速ダウンロードしましょう。
環境の構築
Unityの導入、VCCの導入などについては省略します。詳しい記事がたくさんあるのでそちらをご覧ください。
VRChat SDK以外に必要なアセットは以下の通りです。
モバイル対応のためのモジュールの追加
一度もモバイル向けのアップロードをしたことがない場合は、AndroidとiOSのモジュールを追加していないかも知れません。Unity HUBでUnityにモジュールが追加されているか確認しましょう。モジュールが入っていなければ追加でインストールする必要があります。

AndroidはともかくiOSは入ってない場合も多そう
Unitypackageのインポート
エクスポートしたUnitypackageをUnityにインポートし、prefabをヒエラルキーにドラッグ&ドロップします。

Unityに慣れた方には恐怖の色になりますが気にしません。慌てず騒がずマテリアルを全選択して、シェーダーを変更します。



マテリアル設定の変更
いままではVRMからの変換が必要でしたが、現在はUnitypackageを使ってアバターをインポートして、このままアップロードできます。本当に手軽になりましたね。もちろん、モバイル版の制限に引っかかった場合はアップロードできませんが、少なくともPC向けのアップロードはこの時点でアップロードできます。
このままでもアップロードできますが、せっかくのToon Standarなので、両面描画も設定してみましょう。
両面描画が必要なマテリアルを探して、CullingをOFFにします。


これでひとまずアバターの最低限の準備ができました。ここからは軽量化を行います。
Actual Performance Windowを使用する
ここから先はNDMFによる非破壊編集を行っていきますので、VRChat SDKによるパフォーマンスランクの表示があてになりません。そこで非破壊編集の結果を表示してくれるツールを導入します。
anatawa12's gist selectorと進み、Actual Performance Windowを有効にします。

出てきたウインドウの「Actual Performance Window」にチェックを入れて「Apply Changes」をクリック。

これでツールが有効になります。
軽量化の目標を確認したいので、この状態でプレイモードにしてみましょう。パフォーマンスランクを確認するウインドウが出現します。

ポリゴン数、マテリアルスロットの数、PhysBoneの数が原因でVeryPoorになっていることがわかりましたので、ここからはこれを減らしていきます。
目標のパフォーマンスランクになっている場合
この時点で目標となるパフォーマンスランクになっている場合はこのままアップロードできます。
アップロード画面のPlatform'sのWindows、Android、iOSのすべてにチェックを入れてアップロードしましょう。と言いたいところですが、複数プラットフォームを選んでのアップロードは、アップロードが永遠に繰り返されることがあるので、従来通りWindowsでアップロード、ファイル→ビルド設定→Androidに切り替え、Androidでアップロード…と繰り返した方が安定しています。

とりあえずお手軽に軽量化(AAO Trace and Optimize)
とりあえず真っ先につけるコンポーネントはおなじみの「AAO Trace And Optimize」です。
アバターのルートを選んで、コンポーネントを追加、AAO Trace And Optimizeを選んで終了です。

とはいえ、元々AvatarMakerのアバターは最適化されているので、この程度では全然軽量化できません。手動で軽量化していきましょう。
マテリアルを減らす
アトラス化の設定
同じ設定のマテリアルは結合してしまっても描画に影響はありません。今回は両面描画をしているか否かしか設定に違いがありませんので、マテリアルを2個にできます。軽量化の趣旨とは異なりますが、すべてのマテリアルを両面描画にした場合、マテリアルを1個にできます。
マテリアル結合の下準備として、非破壊でテクスチャーのアトラス化ができるTTT AtlasTextureを使ってテクスチャーをアトラス化する設定を行います。
アバターのルートを右クリック、TexTransTool→TTT AtlasTextureを選択。

AtlasTextureというTTT AtlasTextureコンポーネントが設定された新規オブジェクトが生成されるので、それをクリックします。
インスペクターで各種設定を行います。

赤字で書いていますが「結合時マテリアルの参照」の設定を忘れがちなので注意してください。
TTT AtlasTextureはコンポーネントひとつに対してテクスチャーを1枚作成するので、これで2Kテクスチャーが1枚、マテリアルが2個になります。劇的軽量化です。
Points アトラス化による縮小率
下の画像で確認できますが、今回は2Kテクスチャー1枚にまとめているので、アトラス化による縮小が37%とかなり縮小されていることが分かります。だからといってアトラス化後のテクスチャーを4Kに設定すると、今度はテクスチャーメモリーが嵩み、パフォーマンスランクが悪化します。
できるだけ劣化を抑えたいのであれば、ひとつのコンポーネントでアトラス化するのではなく、コンポーネントを二つに分けて、それぞれ2K、あるいは2K1枚と1K1枚といった設定にすると、縮小率を押さえつつ、テクスチャーメモリーは4Kよりマシ、という状態にする事ができます。
マテリアルの結合
本来なら、ここまで設定すればAAO Trace and Optimizeの機能によりマテリアルが結合されるのですが、一部のアバターではそれが働きません。

過去にも紹介しましたが、「AAO Merge Skinned Mesh」を使って強制的にマテリアルを結合します。
なおこの手法は「Avatar OptimizerとTexTransToolを使ってマテリアルが増えがちなVRoid製アバターのマテリアルを減らす」にも登場しますので、VRoid製アバターで同じ症状に悩まされている方はそちらも合わせてご確認ください。

元々メッシュがひとつなのになぜかこれを使うとマテリアルが結合されるんですよね。不思議。
プレイモードに入ってマテリアルスロットが減っているのを確認しましょう。

メッシュの設定
先ほどのエラーはメッシュに必要な設定がないと言われているだけなので、設定してあげましょう。
アバターのルートにMA Mesh Settingsコンポーネントを追加し、そのコンポーネントでアンカーオーバーライドとルートボーンを登録するだけです。

この時点で目標となるパフォーマンスランクになっている場合はこのままアップロードできます。お疲れ様でした。
ポリゴン数が多い、PhysBoneが多いと言われている方はこのまま続けましょう。
ポリゴン数を減らす
ポリゴン数を減らすため方法として以前は無料で使えるツールとして「lilNDMFMeshSimplifier」が案内されていることが多かったですが、現時点ではそのツール自身がより高速な「Meshia
Mesh Simplification」を案内しているので、ここではMeshia Mesh Simplificationを使います。処理速度が段違いなので、特にこだわりがなければMeshia
Mesh Simplificationを使いましょう。
使い方は簡単です。
コンポーネントを追加して、設定値を少しずつ減らしていくだけです。


ポリゴン数が目標のパフォーマンスランクになればメッシュの削減は終了です。
PhysBoneを減らす
PhysBoneが多いと言われている場合はPhysBoneを減らします。
PhysBoneを減らす場合、PhysBoneをすべて削除して必要なものだけつける、という方法がありますが、Avatar Makerは元々少なめなので、あと数個減らすだけでいいことが多いはずです。(髪型によってはPhysBoneに手を加えなくていいこともあるでしょう。)
ということで、早速PhysBoneを減らします。
PhysBoneを減らすにはVRC Phys Boneコンポーネントを減らすだけです。

髪の毛が短い部分は揺れを解除して、長いところだけ揺らすようにすれば違和感は少ないでしょう。

ここまで来れば軽量化が終わっていると思います。
Windowsでアップロードした後、Android、iOSに切り替えながらアップロードすればモバイル版のアバターが完成です。お疲れ様でした。
なお、VRCQuestToolsを使えば、PCではすべてのPhysBoneコンポーネントを有効にしつつ、Androidでは一部のPhysBoneコンポーネントをオフにする、といった設定ができるようになりますが、これも詳しい記事がたくさんありますので検索してみてください。
透過テクスチャーを使用したマテリアルの削除
AvatarMakerの一部のアバターでは透過テクスチャーが使われていることがありますが、これらはモバイルに非対応です。この記事では途中でマテリアルを一括変更しているので透過設定のマテリアルはなくなっていますが、透過を前提とした表情がある場合、いわゆる海苔と言われる現象が発生します。
これの対応については以前の記事で触れているのでそちらをご確認ください。