VRChatアバターの軽量化まとめてみた
更新:2024/12/18
どうも。しいなずです。
前回のnoteでVRChatを始めたと言ったが、
それから一週間もしないうちから私はアバターの軽量化に奮闘していた。
そのうち、軽量化って意外とノウハウが散らばってるなと調べているうちに感じたので、初心に帰って最初のnoteよろしく情報をまとめていきたいと思う。
軽量化、やってみると楽しいぞ、ダイエットみたいで。
数字に結果が出て嬉しくなるところ、一緒だから。
※このnoteはVCCインストール済みであることを前提とします。
下準備
必要なものを用意しよう
必要となるのは
Actual Performance Window
の4つだ。
このうち、Actual Performance Windowは少し手間がある。
Avatar Optimizer を上記リンクでVCC経由で追加したとき、anatawa12’s gist pack for Unity というものがついてきている。
それを Avatar Optimizer や lilNDMFMeshSimplifier と同様に Manage Project から追加する。
そして Open Project したあとに、Tools から anatawa12's gist selector をクリックする。
以下ウィンドウのようになんか色々出てくるので、そこから Actual Performance Window にチェックを入れる。
以上でActual Performance Windowは入る。
lilAvatarUtilsはリンク先から青い repos の部分をクリックし
.json でおわるURLをコピーして
Settings > Packages > Add Repository してそのURLをペーストだ。
(UPMなどの追加方法がお好きな人はリンク先のREADMEに従うといい)
どのツールも Manage Project から追加するのを忘れずに。
これで必要なツールは入った。
着せる服は1着だけにしよう
着せ替えギミックとかを入れないようにしよう。
Hierarchy から服の部分選んで Inspector から
着てない服の Tag を EditorOnly にしよう。
そうすることで Unity だけでしか表示されない状態になるらしい。
だがそのままだと Scene 上では表示されたままでややこしい。
なので EditorOnly にした服は名前の横のチェックを外すと Unity 上でも非表示になってわかりやすい。
EditorOnly にした服は、VRC 内でエクスプレッションメニューから
表示をオンオフしても出てこなくなる。
ただし技術的にはギミックが効いている扱いになる、らしい。確証はない。
まあ、軽量化しているうちにギミックをわざと使えなくするのだが。
(後述)
もちろん、デフォルトの服なんて着ないし
Hierarchy の中に使わないパーツの名前が残っているのが邪魔だなと感じたら、Delete してもよい。
その場合 Armature 内の、消したパーツに対応する
Physbone 等を消すのも忘れずに。
とりあえずこれ入れとけ AAO Trace and Optimize
とりあえずこれだけでもやっておこうねくらいのレベル。
Hierarchy からアバターを選択して、Inspector の右下、Add Component をクリック。
検索窓に「aao tr」くらいで一番上に来る「AAO Trace and Optimize」を選択すると、
これが出てくる。やることは以上。
このコンポーネントはアバターのアップロード時、
あるいは Unity 上で Play モードにした(再生ボタン押した)
際に処理が発生する。
そのため、これをつけてアップするだけで
軽量化が実行されたと言ってもいい。
もちろん、これ以上に軽量化するには他のコンポーネントが必要になる。
服で見えないところを消す AAO Remove Mesh By BlendShape
よっぽど NSFW なアバターでもないならアバターはみんな服を着ている。
服の下はシェイプキーで絞った腕とか胴体とかがあるだろう。
そこをシェイプキー適用範囲ごとに消すのが
AAO Remove Mesh By BlendShape だ。
消したいところのチェックをオンにするだけでいい。
しくじり先生として参考にしてほしい点がある。
このマヌカちゃんの着ている服のような場合、
札などで隠れてるように見えていても
Shrink_Chest 1 や Breast_big あたりの胸のシェイプキーは消さない方がいい。
(Chikubi とかは消せる)
ある日その状態で他の人と話していたら、
「胸の部分消えてる」
と気づかれたのだ。
それにびっくりして Unity 画面上でよーく見てみると、実際にスキマが生じているのがわかる。
こういった肌の露出部分まわりのメッシュを消す際は、モデルを四方から見て大丈夫かチェックしてみてほしい。
スキンメッシュとかよく知らねーけどだいたい全部マージするぜ AAO Merge Skinned Mesh + AAO Freeze BlendShape
下準備で
「軽量化しているうちにギミックをわざと使えなくする」
と言ったが、その要素が含まれるのがこれだ。
先に言っておくと、これを行うとこういうエラー画面が出る。だが(ギミックを使いたいのでもないかぎり)無視してよい。
では使ってみよう。
Hierarchy からアバター名をクリック、右クリックメニューから Create Empty する。
出来た GameObject に適当な名前をつける。
そしてAdd Component で AAO Merge Skinned Mesh と AAO Freeze BlendShape を追加しよう。
Merge Skinned Meshの使い方
(2024/12/14更新)
先程作った GameObject の Inspector に鍵をかける。右上にある。鍵マークわかりにくいんだよな。
Merged Skinned Mesh を開き、スキンメッシュレンダラーをクリックして展開。
初期状態だと「要素0」「None」になっているはずだ。
そのまま、VRChat SDK > Show Control Panel >Builder(いつものアップロード画面)
下にスクロールして Validations のあたりにいって、Skinned Mesh Renderers: からはじまる項目の Select を押す。
自動的にスキンメッシュが選ばれた状態なので、とりあえずそれを全部 None のところにドラッグアンドドロップ。
そのあとは
顔に相当するスキンメッシュ(マヌカなら Body )エクスプレッションメニューでオンオフしたい小物類など、アニメーションが必要なもの
Create Empty した GameObject
といった、スキンメッシュレンダラー内の取り除きたい要素をクリックして BackSpace か Delete だ。
※2024/12/01更新
Avatar Optimizer(1.8.1)の公式ドキュメントにて、以下の文章が追加されているため訂正。
基本的に軽量化が求められるようなイベント会場では、普通にBodyも入れて良いだろう。
ただしBodyを含めると、特定のモーションをアバターに反映させるワールドで表情が動かなくなることには注意だ。
また、Merge Skinned Mesh に要素を追加しただけでは別のエラーがでる。
Inspector の鍵を解除し、Hierarchy 内のアバター名を選択して
MA Mesh Settings を Add Component してから、マヌカの場合はこのようにする必要がある。
Freeze BlendShapeの使い方
(2024/12/14更新)
Create Empty した GameObject に Add Componentしたら
展開して、下にスクロールして、「すべて有効にする」。
おわり。
Breast_BigとかエクスプレッションメニューでいじりたいならMerge Skinned Mesh同様チェックを外す必要はある。
意外とモデルは高画質すぎ? lilAvatarUtils
(2024/12/14更新)
ここから下は見た目にわかりやすく影響しやすいと思われる軽量化の手段を載せていこうと思う。
そのため、ココからはバックアップを取ることを強く推奨する。
Window > _lil > AvatarUtils を開く。
ウィンドウが出てくるはずなので、Hierarchy が見える範囲で大きくしておく。
この状態で、Hierarchy からアバターを
None (Game Object) のところにドラッグする。
テクスチャ一覧が以下のように表示されるはずだ。
ここで、真っ赤になっている文字の部分に注目してほしい。
ここだけ VRAM Size もダントツで高いことがわかる。
こういった赤いテクスチャがある場合は、
プルダウンメニューから2048(2K画質)にしよう。
その他、画質を落としても気にならなさそうな服とかを1024とかに下げる。
小物ならデフォルトで512くらいになっていると思うが、もう少し下げてもいいかもしれない。
逆に顔周りはあまりサイズを下げない方がいい。2048でもそのままにしてもいいだろう。
テクスチャのサイズを下げたら、Applyを忘れずに。
削れるところは削れ lilNDMFMeshSimplifier
ここからは必要な調整項目が多くなる。
また、一気に見た目に変化が現れるので、下着とか部位の小さいところからこれを適用するとよい。
ポリゴンを減らしたいところを選択 > Add Component > lil と入力 > NDMFMeshSimplifier
そうすると一気に適用したところがガビッとすると思う。
わかりにくいところもあるが、まあ品質のバー(デフォルト値0.5)を弄っていたらわかると思う。
あとは見た目に応じて、許容できる範囲の変化になるように
境界エッジを保持
UVシームのエッジを保持
UVフォールドオーバーエッジを保持
表面の曲率を保持
をオンオフして調整する。
こればっかりはパーツごとによって相性のよいオンオフが違うので、一概にこれつけとけとはいえない。
(ただしスマートリンクを有効化は基本的に外してもいいことないので、ほうっておく)
Mantis LOD Editor について(2024/12/18更新)
lilNDMFMeshSimplifier と似たツールとして、Mantis LOD Editor という Unity の有料アセットがある。某日、セールのため購入した。
導入はこちらのnoteを参照した。
その後、非破壊的にするためにこのBOOTH上の商品を適用する。
画面としてはこんな感じ。
ここで注意してほしいのは、Quality が 100 になっていることと、
Previewのボタンを押さないと画面上にポリゴン軽減が反映されないということだ。
当然ながらQuality を低くしないと、ポリゴンが減らない。
lilNDMFMeshSimplifier と違ってプレビューをクリックしないとポリゴンが減った感じがわからないのも慣れないうちは辛いだろう。
しかし、lilNDMFMeshSimplifier より服の形を保ったポリゴン軽減に強い気がする。
チェーンやヒモといった表現がポリゴン軽減に伴い切れてしまうことが少なく感じた。
また、ポリゴンをどれくらい減らせるかという観点で、 lilNDMFMeshSimplifier と Mantis LOD Editor (をNDMF化したもの)で比較している動画もある。
ぜひ参考にしてほしい。
また今後わかることがあれば随時追記するだろう。
クセがあるけど細かく消せる AAO Remove Mesh By Mask(2024/12/18更新)
Remove Mesh By BlendShape ではその名の通り
ブレンドシェイプごとにメッシュを削除するため
細かいところまでメッシュ削減を追い込めなかった。
だが、このコンポーネントなら更に細かいところまでメッシュを削減できる。
Skinned Mesh Renderer が Inspector にあるパーツで
Add Component > 「by m」と検索窓に入力 > AAO Remove Mesh By Mask
たとえばマヌカの Manuka_body に追加すると、以下のような初期画面になるだろう。
0番のマテリアルスロットに適用 にチェックを入れる。
するとマスクテクスチャが None になっているので二重丸(?)をクリックして検索窓に body と入力、体のテクスチャを選択する。
(2024/12/18訂正)
二重丸の右の「作成」からアルファマスク画像を作成する。
アルファマスク画像の名前の決定と保存場所の指定を求められるので、わかりやすいところに保存する。
編集可能にし、編集ボタンで AAO マスクテクスチャエディター を開く。
ここではマスクを塗りつぶしてそのマスクに対応するメッシュを消す作業を行う。
とはいえ、触りたての人間がメッシュとただにらめっこしたところで、どこを塗りつぶせばどこを消せるかなどわかりっこない。
とりあえずマウスでもいいので適当に塗りつぶし、感覚で「ここを塗りつぶしたらここが消える」というのを覚えていく。
覚えたら、ブラシサイズを小さくして削除範囲の微調整をしていく。
デフォルトだと Remove Black なので、黒く塗りつぶしたところのマスクに対応するメッシュが消えるはずだ。
PhysBoneについて(2024/11/27)
同日、第25回改変なんでも質問会にて聞いたことを元に書き記す。
Very Poor, Poor といったアバターの評価は最も重たいところを基準に評価を付けるため、メッシュをいくら軽くしてもテクスチャをいくら軽くしても他のところが重たかったら Poor 評価などになる。
これまでの軽量化を行ってもなおも重たかったポイントが、私のアバターの場合 PhysBone Component とか PhysBone と頭につく要素のあたりだった。
これは何か? 端的に言えば、揺れものを揺らすためのボーンである。
それがアバターのデフォルト状態だとたくさんあるので、軽量化するにはそれらを減らす必要があるのだ。
減らす順番
1.PhysBone Componentを減らす
2.Transformsを減らす
PhysBoneが揺らすボーンを減らす
複数のボーンを1本にまとめちゃう
3.Collidersを減らす
ここモノ当たらないだろってところは減らす
揺らすところを減らす、というより
「ここだけは揺らせるように残しておきたい」
と決めておいた上でPhysBoneを削ると良い。
Physboneの消し方
Armature > (Physboneを消したいパーツのところに行く) > VRC Phys Bone のコンポーネントを削除
Collidersをなくす
VRC Phys Bone 内 Collision の Colliders プルダウンを開く
Size を 0 にする
PhysBoneを間引くやつというツールがあるらしい(随時更新予定)
こういうことができるらしい。
マニュアルはこちら(DL方法も記載)。
使用感をまだ見ていないが、わかり次第記載したいと思う。
参考にしたサイト
メタカル最前線|アバター最適化の味方! Avatar Optimizerの使い方を解説!【VRChat】