VRChat / Unity エディタ拡張 — VPM パッケージ
VRChatアバターの軽量化とQuest / iOS対応を、1つの統合ウィンドウ(Avatar Studio)でまとめて実行。
元アバターは一切変更しない非破壊方式で、PC用の _Opt・Quest用の _Quest 複製を生成します。
ボタンを押すと VCC(VRChat Creator Companion)または ALCOM が起動し、リポジトリの追加確認画面が開きます。
手動で追加する場合の URL
https://rara-vrc.github.io/rara-avatar-tools/index.json
VCC / ALCOM の Settings > Packages > Add Repository に貼り付けてください。
本ツールは anatawa12 氏の AAO: Avatar Optimizer と処理を分業する設計です。実行時は、生成した複製にのみ次の AAO コンポーネントを自動で追加・設定します(元アバターには一切追加しません)。
Merge Skinned Mesh / Remove Mesh By BlendShape は Trace and Optimize が無くてもビルド時にAAOが適用します)。SkinnedMeshRenderer を1つの SkinnedMeshRenderer へ統合します(「SkinnedMesh統合」の実体)。統合時は BlendShape 名を自動変更して重複を避けます。レンダラーをグループ1〜8に振り分けて、まとまりごとに統合するグループ指定モードもあります(顔は常に自動保護)。PhysBone のマージ(設定が一致する兄弟チェーンを1本へまとめてコンポーネント数を減らす処理)は、AAO の Merge PhysBone ではなく本ツール独自の実装です。
本ツールは オープンベータ(Open β) として公開中です。不具合報告・要望をお待ちしています。
リポジトリを追加し、プロジェクトにパッケージを入れると、Unity のメニューバーにツールが追加されます。
https://rara-vrc.github.io/rara-avatar-tools/index.json を貼り付けます。
Packages/jp.rara.avatar-tools/ に配置されます。
com.anatawa12.avatar-optimizer)が担当する分業設計です。
AAO が無いと削減効果が出にくく、Quest ではスキンメッシュ数の上限に収まらず Very Poor になりやすく、既定で相手にフォールバック表示され揺れ物も停止し得ます(アップロード可否自体はサイズ上限のみで決まります)。
ブラウザで https://vpm.anatawa12.com/add-repo を開き、VCC / ALCOM で
Add Repository → プロジェクトに Avatar Optimizer を追加 → Unity へ戻ってください。
メニューは1項目に統合されています。開いたあとにウィンドウ上部のチップで PC / Quest / 両方を切り替えます(既定は両方)。
ウィンドウは上から順に進めれば完了する構成です: 対象/プリセット → ① 診断 → ② 構成整理 → ③ PhysBone → ④ テクスチャ → ⑤ ポリゴン(Meshia連携) → ⑥ マテリアル → ⑦ 実行 → ⑧ ヘルプ。 各ステップの詳細を下の折りたたみで確認できます。
シーンに置いたアバター(VRCAvatarDescriptor 付き)を選ぶと、自動で診断が走ります。上部の「対象」チップで PC / Quest / iOS を切り替えます(既定は両方)。目的に近いプリセットを押すと、対象と目標ランクがまとめて設定され、あとから各項目で微調整できます。
VRChat SDK の性能統計 API を使い、現在の総合ランク・カテゴリ別ランクを PC 基準と Quest 基準の二列で表示します。対象ごとに目標ランクを選べます。EditorOnly タグのオブジェクトは、実際のビルドと同様に除外して計算されます。下部の「目標達成ガイド」には、目標を超えた項目ごとに推奨アクションと「→ ステップ n で対応」ボタンが並びます。Quest 基準では、推定ダウンロードサイズ(10MB 上限との比較)・Quest 非対応シェーダーのマテリアル一覧・Android 非対応コンポーネント一覧・テクスチャ設定の警告も表示します。
各数値はそのランクの上限。値がその数値以下なら少なくともそのランク以内。Poor の数値を超えると Very Poor になります(数値は SDK 判定アセットの実値)。
| 項目 | Excellent | Good | Medium | Poor |
|---|---|---|---|---|
| ポリゴン(三角形) | 32,000 | 70,000 | 70,000 | 70,000 |
| スキンメッシュ数 | 1 | 2 | 8 | 16 |
| メッシュレンダラー数 | 4 | 8 | 16 | 24 |
| マテリアルスロット数 | 4 | 8 | 16 | 32 |
| テクスチャメモリ(MB) | 40 | 75 | 110 | 150 |
| ボーン数 | 75 | 150 | 256 | 400 |
| PhysBone コンポーネント | 4 | 8 | 16 | 32 |
| PhysBone 対象トランスフォーム | 16 | 64 | 128 | 256 |
| PhysBone コライダー | 4 | 8 | 16 | 32 |
| PhysBone 衝突判定回数 | 32 | 128 | 256 | 512 |
| コンタクト(ローカル除く) | 8 | 16 | 24 | 32 |
| コンストレイント | 100 | 250 | 300 | 350 |
ポリゴンは Excellent だけ 32,000、Good / Medium / Poor はすべて 70,000。32,001〜70,000 は Good に載り、70,000 を超えると一気に Very Poor になります。
iOS も Quest(Android)と同じモバイル制限。アップロード可否はサイズ上限(ダウンロード10MB / 展開後40MB)のみで決まり、Very Poor でもアップロード自体は可能(既定でフォールバック表示・Show Avatarで表示可、既定の表示ランクは Medium)。
| 項目 | Excellent | Good | Medium | Poor |
|---|---|---|---|---|
| ポリゴン(三角形) | 7,500 | 10,000 | 15,000 | 20,000 |
| スキンメッシュ数 | 1 | 1 | 2 | 2 |
| マテリアルスロット数 | 1 | 1 | 2 | 4 |
| PhysBone コンポーネント | 0 | 4 | 6 | 8 |
| PhysBone 対象ボーン | 0 | 16 | 32 | 64 |
| PhysBone コライダー | 0 | 4 | 8 | 16 |
| PhysBone 衝突判定回数 | 0 | 16 | 32 | 64 |
| コンタクト | 2 | 4 | 8 | 16 |
| テクスチャメモリ(MB) | 10 | 18 | 25 | 40 |
トグルで切り替える衣装・アクセサリを検出し、各グループを「維持 / 常時表示 / 非表示除去」から選びます。
EditorOnly)。ビルドから外れます(AAO 不要)。再処理時の残骸削除(1.8.1)。変換済みアバターをもう一度処理する場合、前回の統合先の残骸(命名が RARA_MergedMesh / RARA_MergedMesh_G{n} で、メッシュ未設定のもの)を変換時に複製から自動で削除します(古い AAO Merge Skinned Mesh ごと消えるため、新しい統合先との二重統合の衝突を防ぎます)。削除は複製のみで、元アバターは変更しません。統合プレビューには「前回の統合先(残骸)。実行時に複製から削除されます」と表示し、統合後(概算)の枚数からも除外します。自作のメッシュ未設定レンダラー(本ツールの命名に一致しないもの)は削除しません。
削減サイズの目安(1.5.0)。各トグルグループに「非表示固定で減る専有アセット」の削減量チップ(圧縮後 -◯MB / 展開後 -◯MB)を表示します。専有アセットはそのグループのサブツリー内だけが使うテクスチャ・メッシュで、素体などと共有するものは非表示にしても減らないため計上しません(共有だけのグループは「共有テクスチャのみ」と表示)。サイズ超過時は、削除候補を専有削減量の大きい順に提示するガイドも出ます(合計は入れ子の衣装グループを二重計上しません)。
Quest 対象のときは、続けて Quest 除外(ビルド除外)と 隠面メッシュ削減(服の下に隠れる肌などをブレンドシェイプで削除)もここで設定できます。
EditorOnly / Quest除外の非表示(1.5.1)。EditorOnly タグ付き・Quest除外に登録したオブジェクトは、診断だけでなく各セクションの一覧・プレビュー(マテリアル・衣装/トグル整理・SkinnedMesh統合・PhysBone・ポリゴン削減・隠面メッシュ・テクスチャ)と変換からも自動で外れます(ビルドに含まれないため。統合前後の概算にも数えません)。非表示にした項目があるセクションには「EditorOnly/Quest除外のため n 件を非表示(ビルドに含まれないため)」を1行だけ表示します。Quest除外の登録パネルだけは全件を表示し、既に EditorOnly タグが付いているものには「EditorOnly」バッジを付けます。除外配下だけで使うマテリアルは変換もスキップします(混在利用は従来どおり変換)。
隠面メッシュ削減の検出。① ブレンドシェイプ名が隠し / 縮小系トークン(shrink / hide / 縮小 / 非表示 / 削除 / 消し / 隠し 等)を含む、または部位トークン(肌 / 素体 / パンツ / インナー 等)とオフ系トークン(off / オフ / なし 等)が同居するものを候補化。② 顔まわり(顔 / 目 / 眉 / 口 / 涙 / まつ毛 / ほくろ、あ・い・う・え・お、まばたき 等)は名前・ジオメトリの両面で除外し、表情・MMD標準モーフ・リップシンクの誤削除を防止。③ 名前が一致しなくても、最終フレームで頂点の大部分(約40%以上)を強く動かす形状だけを幾何判定で候補化(保守的な閾値)。
FakeShadow / アウトラインのみなど何も描かないものは、統合の直前に複製から自動で削除します。多重描画でなくなるため、ポリゴンを増やさず・見た目も変えずに通常どおり統合されます(Quest の疑似影付き髪などが操作なし・見た目の変化なしで自動統合。統合後の概算が 3 に留まっていたものが 2 に)。(2) 見える上描き(前髪影など)はチェックで削除して統合 — 実際に重ねて描かれている余剰スロット(例: PC の FakeShadow)は、プレビュー各行の「上描きスロットを削除して統合(前髪影などの重ね描き効果が消えます)」チェック(既定オフ)で削除して統合できます。重ね描き効果は失われますが、SkinnedMesh数・スロット数を確実に減らせます(チェックすると理由が「上描きスロット削除により統合します」に変わります)。(3) 差し替えアニメ対象は不可 — マテリアル差し替えアニメ(m_Materials.Array.data[N])の対象レンダラーは、削除するとスロット番号がずれてアニメが壊れるため、自動削除・チェックのいずれの対象にもしません(「マテリアル差し替えアニメがあるためスロット削除不可」と表示)。削除するのは常に余剰スロット(サブメッシュ数を超える分)だけで、基底スロットには手を付けません。複製のみで元アバターは変更しません。mat_hair + FakeShadow の2スロットを1サブメッシュへ重ねて多重描画していることがあり(1.0.9からアトラス化せず残す方針)、AAO はビルド時に多重描画を実体化(サブメッシュを複製)するため、統合すると ビルド後のポリゴン数が増えます(実例では PC の _Opt 複製が 68,674 → 78,948 三角形へ増え、PCの 70,000 の崖を越えて即 Very Poor に)。1.7.1 からは統合せずそのまま残します(SDKのポリゴン数は増えません)。(2) マテリアルアニメーションの対象が食い違うメッシュは統合しない — 統合すると AAO がそのアニメを統合先メッシュ全体へ波及させ、意図しない部分にも適用されることがあるため、アニメの向いているメッシュを統合から外します(統合ソース全員が同じ material. アニメ集合ならそのまま統合)。いずれも統合プレビューに理由を表示します。また、上記の同名 BlendShape の値不一致で「アニメで動かしているシェイプ」(例: ジャケットのトグルで動く shrink_for_jacket)は、実行時にアニメーションが値を決めるため多くの場合は無害 で、変換レポートの案内にもその旨を明記しました(見た目が意図と異なるときだけ該当メッシュを統合から除外します)。AAO が出す最適化結果のログ(「!」アイコン付きで削減量などを報告するもの)は エラーではなく正常な成果報告 です(赤字のエラーでなければ変換は成功しています)。元アバターの共有アニメクリップは変更されず(クローン側のクリップだけ編集)、m_IsActive 以外のアニメ(ブレンドシェイプ等)は維持されます。
残す・削除・マージを設定します。各 PhysBone の「残す」チェックは既定オン(チェック=残す)で、外すと削除されます。マージのオン/オフもこのセクション内で切り替えます。設定が一致する兄弟 PhysBone チェーンを共通の親でまとめ、揺れを維持したままコンポーネント数を削減します。積極マージ(既定オン)では、完全一致しない兄弟チェーンも先頭の設定に統一してマージします(アニメ制御・パラメータ使用などの安全ゲートは維持)。
選択後の値が PC / Quest の上限とあわせて色付きで表示され、コンポーネント・影響 Transform・コライダー・衝突判定回数・コンタクトの5本のメーター(1.11.0)、ランク別の上限ラダー、「次のランクまであと何個」の目安が併記されます。上限を超えた項目は赤くなります。
| PhysBone コンポーネント上限 | Excellent | Good | Medium | Poor |
|---|---|---|---|---|
| PC | 4 | 8 | 16 | 32 |
| Quest / iOS | 0 | 4 | 6 | 8 |
VRCContactSender / VRCContactReceiver)も PhysBone と同様に残す/削除の取捨選択と「優先度で自動選択」の対象になります(いずれも1.11.0・複製のみで元アバターは無改変)。メイン・エミッション・ノーマル・マスク類まで全テクスチャのメモリ寄与を推定し、寄与の大きいものから縮小提案を並べます。個別「適用」または「提案をすべて適用」で縮小計画に登録し、目標ランクの上限に収まるよう自動調整もできます。Quest では、推定サイズを 圧縮後(ダウンロード)10MB と 展開後(非圧縮)40MB の2つの上限に並べて判定し(どちらか一方でも超えるとアップロード不可)、「上限内まで自動調整(圧縮後10MB・展開後40MB)」で両方に収まるよう、寄与の大きいテクスチャから段階的に解像度を下げる計画を自動作成できます(顔・体系の名前を持つテクスチャは後回しにして画質を優先)。テクスチャを最小(縮小フロア)まで下げても届かない場合(展開後がメッシュ・ブレンドシェイプ支配のときなど)は、その旨を正直に表示し、⑤ ポリゴン削減・Quest除外・不要ブレンドシェイプ整理の併用を案内します。
Generated に作られ、複製がそれを参照します。元のテクスチャとインポート設定には一切触れません。「縮小計画をクリア」でいつでも取り消せます。ポリゴン削減は Meshia Mesh Simplification(Ram.Type-0 氏 / MIT)へ連携する方式です。本ツール自前の頂点間引き UI は 1.6.0 で廃止 し、本ツールは目標三角形数の指定と「_Quest」複製への Meshia コンポーネント追加を担当します(実際の簡略化は Meshia がビルド時に実行)。既定は無効(明示的に有効化)。
Meshia Cascading Avatar Mesh Simplifier)で部位ごとに目標三角形数や保護設定を個別調整でき、EditMode プレビューで品質を確認できます。Meshia Mesh Simplification(Ram.Type-0 氏 / MIT)は、NDMF で ビルド時(Play / アップロード) にメッシュを高品質に簡略化するツールです。1.6.0 から、本ツールの ⑤ ポリゴン削減はこの Meshia へ連携する方式 になりました。目標三角形数を指定すると、本ツールが「_Quest」複製の子オブジェクトへ Meshia のアバター単位コンポーネント(Meshia Cascading Avatar Mesh Simplifier)をワンボタンで追加・設定します(この自動付与には Modular Avatar が必要です。未導入時はパネルに導入案内が出るだけで付与されません)。導入は VPM リポジトリ https://ramtype0.github.io/VpmRepository/ を VCC / ALCOM に追加して行います(公式ドキュメント)。
Meshia Cascading Avatar Mesh Simplifier で部位ごとに目標三角形数や保護設定を調整します(さらに細かく詰めたいときは、レンダラー単位の Meshia Mesh Simplifier を手動で足す方法もあります)。EditMode プレビューで品質を確認できます。PC 列と Quest 列を並べて、アトラス統合や変換方法を設定します。
全マテリアルが一覧表示され(透過 / カットアウト / パーティクル / アニメ使用 / メニュー・ギミック参照などのバッジ付き)、マテリアルごとに変換方法を選べます:自動(推奨) / Toon Standard / Toon Lit / MatCap Lit(金属・ツヤ向け) / パーティクル加算 / パーティクル乗算 / 非表示 / 変換しない。各行に「変換後にどうなるか」が表示されます。Modular Avatar の Material Setter や Avatar Menu Creator 等から参照されるマテリアルも収集・変換・差し替えされます(メニューで切り替わる目・衣装・表情差分の消失を防止)。
Quest には半透明シェーダーが無いため、アルファブレンド透過(チーク・涙・ガラス等)は乗算 / 加算の Particles シェーダーで近似再現します。暗めの透過は Particles/Multiply(乗算)、明るい透過は Particles/Additive(加算)へ、メインテクスチャの明るさから自動判定。既定処理は「透過マテリアルの既定処理」で 自動で半透明を再現(推奨) / 非表示にする(最軽量) / 不透明に変換から切り替えられ、マテリアル単位の上書きも可能です。大型メッシュと髪、カットアウト(髪の透け先端など)は保護対象で、常に不透明として変換されます。1.4.2 からは顔も自動保護され、顔(アバターディスクリプタのビセーム / まばたきメッシュ、または名前に face・顔 等を含むメッシュ / マテリアル)の基底マテリアルは、透過設定でも半透明の自動再現(パーティクル化)や非表示の対象にせず、常に不透明(Toon Standard)へ変換します(顔の白飛び・消失を防止)。チーク・涙・ハイライトなどのオプション重ねマテリアル(名前で判定)は従来どおり乗算 / 加算で近似します(既存の大型メッシュ・髪の保護と同じ扱い)。
互換性のある複数マテリアルを1枚のアトラステクスチャ+1マテリアルに統合し、メッシュの UV を再マップしてスロット数を減らします。同一メッシュ内は変換時、メッシュをまたぐ統合はビルド時に AAO が実施。アニメでマテリアル差し替えされるもの、UV が 0..1 範囲外(タイリング使用)のものは自動で対象外(理由付きで表示)。PC 列では、テクスチャ無しの色だけ材質は色セルを、エミッションはエミッションマスクセルをアトラスにベイクして、統合後も色・発光が保たれます。
RARA_Atlas_* を含む)でも、そのまま使いつつスロットを削減できます。変換済みマテリアルと同じグループ規則(シェーダー・カリング・影ランプ・マットキャップの同一性)で統合します。MatCap Lit・パーティクル系は対象外です。過去のアトラス出力が入力に含まれるときは、変換レポートに「元アバターから変換し直すとより効率的に統合できます」と案内します。Quest 対象のときは、表情デカール(チーク / 涙 / アイハイライト)の再現・非表示や、Quest 変換設定(シェーダー・テクスチャ形式など)もこのステップで設定します。変換設定の詳細設定では、マットキャップの引き継ぎ(既定オン。オフ=削除相当、映り込みが乱れる場合はオフ推奨)や Network ID の割り当て(PC/Quest間の揺れ物の掴み同期・既定オン)も切り替えられます。変換設定は実行の直前に最終確認できるよう末尾に配置されています。
金属パーツやツヤのある面に使う「マットキャップ(MatCap)」を、Quest / iOS でも近い見た目で再現します。⑥ マテリアルの Quest 列で設定します。
lilToon のマットキャップは 1.1.0 から、変換先の Toon Standard が持つ内蔵マットキャップへ自動で引き継がれます(設定不要)。NonToon も従来どおり近似変換され(乗算 / 加算の2枠を Toon Standard の1枠へ近似)、VRM MToon の加算スフィア(SphereAdd)も加算マットキャップとして引き継がれます。Poiyomi のマットキャップは自動では引き継がれません(変換レポートに表示)。金属パーツなど映り込みを残したい場合は、マテリアル別指定「MatCap Lit(金属向け)」を選ぶと Poiyomi のマットキャップ画像を引き継いで変換できます。この引き継ぎは Quest 変換設定の詳細設定「マットキャップを引き継ぐ」でオン/オフでき(既定オン)、オフにすると引き継がれません(削除相当。映り込みが乱れる場合はオフ推奨)。
変換方法で、変換先に VRChat/Mobile/MatCap Lit を選べます。メインテクスチャ × マットキャップの乗算にライティングを足したシンプルなシェーダーで、金属のツルッとした映り込みに最適です。
実行オプション(プレファブ保存・AAO 付与)を確認し、「この実行で行われること」の要約と実行前の確認ダイアログを見てから実行します。元アバターは変更されず、PC 用に {名前}_Opt、Quest 用に {名前}_Quest の複製がシーンとプレファブの両方に生成されます。アップロードするのはこの複製です。
実行後は、変換前後の比較テーブル(PC / Quest、目標との突き合わせ)と、Quest の変換結果チェック(元 ←→ 変換後マテリアルのサムネイル比較)が結果欄に表示されます。
_Opt / _Quest 複製は自動で作り直され、生成アセットは決まった場所へ GUID 保持で上書きされるので、複製が増え続けたり参照が壊れたりしません。元アバターの名前を変えたあとに取り残された古い複製がある場合は、実行結果に名前付きで警告が出ます(自動削除はしません)。診断は「見積り」ですが、実測レポートは ビルド / Play 時の最終的な複製そのもの を VRChat SDK と同じ計算で実測して確認できる別ウィンドウです。メニューの RARA / 実測レポート から開きます。MA(Modular Avatar)・AAO・Meshia・lilToon などの適用後、EditorOnly 除去後の本当の数値が分かるため、診断のエディタ数値が控えめに出る分をここで確認できます。1.4.0 からは、変換が完了すると自動で ビルド不要の即時実測 も走り、生成直後の複製の最終値を ▶️(Play)や SDK ビルドを待たずにその場で確認できます(下記)。
_Opt / _Quest 複製を ▶️(Play)すると、ビルド時と同じ前処理を通した最終複製を実測し、結果がポップアップ表示されます。PC 基準・Quest 基準の両方の総合ランク・項目別の値・目標ランクとの達成判定・元アバターとの差を並べます。_Opt / _Quest 複製だけを計測します。「_Opt / _Quest 以外のアバターも計測する」で全アバターを対象にでき、編集モードでは「再計測」でスタジオ診断による測り直しもできます。1つの Blueprint ID で _Opt(PC)と _Quest(Quest / iOS)を同一アバターの両対応版(フォールバック)として上げる手順が、ウィンドウに内蔵されています。
_Opt をアップロードすると、Blueprint ID が割り当てられます。_Opt の Blueprint ID を _Quest へコピーします(宛先に別の ID がある場合は確認ダイアログ)。_Optだけ / _Questだけをアクティブ化(1.5.1)。手順①・④のボタンで、アップロードする複製だけをシーンでアクティブにし、元アバターともう一方の複製(_Opt / _Quest)だけを非アクティブにします(無関係なアバターや非アバターには触れません。Undo で元に戻せます)。SDK パネルはアクティブなアバターを一覧するため、誤って別のアバター(PC 用シェーダーのままの _Opt や元アバター)を選んでしまう事故を防げます。ボタンの隣に現在のアクティブ状態を表示します。
ビルドターゲットとの食い違い警告(1.5.1)。ビルドターゲットが Android / iOS なのに _Quest が非アクティブで元または _Opt がアクティブなときは、赤い警告(SDK パネルで PC 用アバターを選んでいると Mobile 非対応シェーダーの警告が大量に出てビルドできない旨)を表示します。
_Quest の方です。lilToon / NonToon(jp.lilxyzw)/ Poiyomi Toon(ロック済みも可)/ Unity Standard・Unlit / VRM MToon(VRoid)。lilToon が最も忠実で、他はプロパティ読み取り+ティント焼き込みの近似変換です。前髪影(FakeShadow)やアウトライン専用などのエフェクト専用シェーダーは、Quest で再現できないため自動で非表示化されます。
VRChat/Mobile/Toon Standard(既定)または Toon Lit(最軽量)へ変換。質感をテクスチャにベイク。透過は Particles Multiply / Additive で近似。マットキャップは Toon Standard へ引き継ぎ、金属パーツは MatCap Lit も選べます。
Unity 2022.3 系(2022.3.22f1 で確認)。VRChat Avatars SDK 3.8.1 以降(3.10.4 で確認)。レンダーパイプラインは Built-in のみ。
元アバターは無変更。_Opt / _Quest のシーン複製とプレファブを出力。何度でも安全に再生成できます。