見出し画像

VRChatアバターの軽量化まとめてみた

更新:2024/12/18

どうも。しいなずです。

前回のnoteでVRChatを始めたと言ったが、
それから一週間もしないうちから私はアバターの軽量化に奮闘していた。

そのうち、軽量化って意外とノウハウが散らばってるなと調べているうちに感じたので、初心に帰って最初のnoteよろしく情報をまとめていきたいと思う。

軽量化、やってみると楽しいぞ、ダイエットみたいで。
数字に結果が出て嬉しくなるところ、一緒だから。

※このnoteはVCCインストール済みであることを前提とします。


下準備

必要なものを用意しよう

必要となるのは

  1. Avatar Optimizer

  2. Actual Performance Window

  3. lilToon(と同じレポジトリにあるlilNDMFMeshSimplifier)

  4. lilAvatarUtils

の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 にチェックを入れる。

チェックを入れたらApply Changesを忘れずに

以上で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 上でも非表示になってわかりやすい。

こうなればよい
(自分の改変マヌカのデフォルト服のInspector)

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_Spine 1, 2)が消えている

しくじり先生として参考にしてほしい点がある。

このマヌカちゃんの着ている服のような場合、
札などで隠れてるように見えていても
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も入れて良いだろう。

以前のAvatar Optimizerは顔のメッシュを他のメッシュと統合することを推奨していませんでした。 これは、Unity 2019でBlendShapeの多いメッシュを統合するとメッシュの負荷が大幅に増加してしまうためです。
Unity 2022ではBlendShapeの負荷が改善されているため、その記述は取り下げられました。

https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/merge-skinned-mesh/

ただしBodyを含めると、特定のモーションをアバターに反映させるワールドで表情が動かなくなることには注意だ。


また、Merge Skinned Mesh に要素を追加しただけでは別のエラーがでる。

Inspector の鍵を解除し、Hierarchy 内のアバター名を選択して
MA Mesh Settings を Add Component してから、マヌカの場合はこのようにする必要がある。

正直ここについてよくわかってないが、参考にしたサイトの見よう見まねだ
設定モードに関しては、自分でChestとHipsを指定できるようになっていれば良い

Freeze BlendShapeの使い方

(2024/12/14更新)

Create Empty した GameObject に Add Componentしたら
展開して、下にスクロールして、「すべて有効にする」。

おわり。

Breast_BigとかエクスプレッションメニューでいじりたいならMerge Skinned Mesh同様チェックを外す必要はある。

(一番上に戻る)

意外とモデルは高画質すぎ? lilAvatarUtils

(2024/12/14更新)

ここから下は見た目にわかりやすく影響しやすいと思われる軽量化の手段を載せていこうと思う。
そのため、ココからはバックアップを取ることを強く推奨する。

Window > _lil > AvatarUtils を開く。

ウィンドウが出てくるはずなので、Hierarchy が見える範囲で大きくしておく。

lilAvatarUtils の初期ウィンドウ(大きくした)

この状態で、Hierarchy からアバターを
None (Game Object) のところにドラッグする。
テクスチャ一覧が以下のように表示されるはずだ。

New Project から開いた一切手を加えていないマヌカのテクスチャ一覧

ここで、真っ赤になっている文字の部分に注目してほしい。
ここだけ 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】


いいなと思ったら応援しよう!

しいなず/旧:ななしぃ
最後まで記事を読んでくださりありがとうございます。 皆様に頂いたチップは、感謝を込めて ・有料noteの購読 ・勉強のための書籍購読 などに使わせていただきます。