見出し画像

Avatar Optimizer(AAO)を使用してアバターを軽量化しよう【VRChat】

皆さん、VRChat楽しんでますか?アバター重くないですか?

「VeryPoorから抜け出せないんだけど」「軽量化何も分からん」

VRChatを楽しむ上で誰もが通る道である「改変」ですが、軽量化は意外と通らない人が居るみたいです

アバター重いんだよねと言ってるフレンドに
「Avatar Optimizer使いなよ」と言っても「なにそれ?」となることが多々あります

VRChatは最適化不足なゲームと見ることが有りますが・・・
最適化されていないのはゲーム自体ではなく各々がアップロードするアバターだぞー!
私は声を大にして言いたい

※この記事は改変に必要なUnityやVCCについて最低限の知識が有る事前提に記述しています
執筆現在(2024/04/12)で使用できる機能の説明となります
アバターランクを改善するにあたりAAOでは解消できない点もあり効果を確約する事は出来ない点についてご了承下さい


この記事では以下の機能についてざっくり解説します
・Trace And Optimize
  → 自動的に不要な物を消してくれる凄い機能
・Remove Mesh in Box
  → 範囲指定したメッシュを消してくれて便利
・Merge Skinned Mesh
  → Skinned Meshを纏めてくれる機能(実はMaterial Slotも減る)

もっと詳しく知りたいよ~って方は公式のチュートリアルを参照して下さい





Avatar Optimizerを導入しよう

何はともあれ導入しなければ話になりません
以下から取得してください

Avatar Optimizer(以下AAO)はzipファイルをDLしてプロジェクトに登録する事も出来ますが、頻繁にアップデートが行われているのでVCC経由で導入する事をオススメします
インストール方法は上記AAOのストアページ中段辺りに有るのでそちらを参照して下さい

レポジトリをVCCに追加すると以下の2つが追加されているはずです
どちらも必要なのでプロジェクトに適用して下さい

「AAO:AvatarOptimizer」と「anatawa12's gists pack」

複数のスクリプトを読み込む為、追加した後の初回起動に少々時間がかかるのでコーヒーでも飲んで待つことをオススメします

VRChat上でのアバターランクを確認しよう

人間目標や指標が無いとやる気が上がらないものですよね
おそらく「軽量化がよくわからない」って言う原因はここに有るんじゃないかな~と思っています
Unity上でも【VRChatSDK】の画面を確認するとアバターランクは確認出来ますがAAOにはもっと便利な機能があります

VRChat SDK

ActualPerformanceWindowで現在のランクを確認しよう

Unityのメニューバーから「Tool」を選択し、「anawata12's gist selector」を表示する

「ActualPerformanceWindow」を選択し、「Apply Changes」を押す

「ActualPerformanceWindow」画面は不要なのでウィンドウを消してください

「ActualPerformanceWindow」を表示する場合はUnity上でプレイモードに入ったタイミングで計算された値が表示されます
実際に表示してみましょう

画面上部の中央にあります
左がPC版、右がAndroid(Quest)対応のステータスと数値

今後はこの画面を見つつ軽量化作業を進める事をオススメします

Trace And Optimizeを設定して自動最適化しよう

「何か楽に軽量化出来ない?」「面倒なのは嫌だよ~」
そんな声に応えてくれるかもしれない機能がこれ

主な機能は以下の通り(公式のドキュメントを引用)

●BlendShapeを自動的に固定・削除する
 アニメーションなどで使われていないBlendShapeを自動的に固定・除去します。
●使われていないObjectを自動的に削除する
 アニメーションなどを走査して、使われていないObject(GameObjectやコンポーネントなど)を自動的に削除します。
・endボーンを残す
  親が削除されていないendボーン1を削除しないようにします。
●面積がゼロのポリゴンを自動的に削除する
 面積がゼロのポリゴンを削除します。
●PhysBoneの設定を最適化する
 PhysBoneの設定について、以下の最適化を行います。
 ・全く同じ設定のPhysBone Colliderを1つに統合します。
 ・不要な場合にIs Animatedのチェックを外します。

また、以下の設定で自動設定を調節できます。
●MMDワールドとの互換性
 MMDワールドで使われるBlendShapeを固定しないなど、MMDワールドとの互換性を考慮した軽量化を行います。

https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/trace-and-optimize/

改変アバターに関して言うならば
「着せ替え前の服に紐付くボーンや見えないメッシュを自動的に削除するよ」
と言うような感じで使用されないのに残ってる物を消す機能になります

アバターに入れてみよう

設定方法は非常に簡単です

①Hierarchyのアバターのルートを選択
②ルートのInspectorの「Add Component」をクリックし、「AAO Trace And Optimize」をクリック

①Hierarchyのアバターのルートを選択
②ルートのInspectorの「Add Component」をクリックし、「AAO Trace And Optimize」をクリック

ね、簡単でしょ?

実際の効果の確認をしてみよう

本当に減るのか疑問ですよね?私もそう思う
なので確認してみましょう

今回検証に使用するアバターはポンデロニウム研究所さんの「桔梗」ちゃんです

プロジェクトにPrefabを配置した状態のステータス

バニラ状態の桔梗ちゃん

検証の為にコートを消した状態で比較します

メッシュをOFFにしてTagをEditorOnlyにする
ポリゴンがコートの分減っている事がわかる

ここにTrace And Optimizeを適用した場合がこちら

非表示にしたコートに紐付くBoneが削除されBoneの数値が軒並み減っている

入れるだけでオトクなので是非入れましょう



Remove Mesh in Boxを使って不要なメッシュを削除しよう

改変している時に貫通している部分だけを消したい事ってありますよね?
MeshDeleter等を用いれば消すことは出来ますが、メッシュが上書きされるので微調整にはあまり向いていません

そこでオススメするのが今回紹介するRemove Mesh in Boxです

アバターに入れてみよう

こちらも導入は非常に簡単です

①Hierarchyの消したいメッシュを選択
②メッシュのInspectorの「Add Component」をクリックし、「AAO Trace And Optimize」をクリック

①Hierarchyの消したいメッシュを選択
②メッシュのInspectorの「Add Component」をクリックし、「AAO Trace And Optimize」をクリック

Remove Mesh in Boxで消したいメッシュの範囲を指定しよう

Componentを追加すると以下のメニューが追加されます

AAO Remove Mesh in Box

このメニューで触る所は2箇所です
・「Stop Preview」押す事でプレビュー状態のON/OFFが出来ます
・「Edit This Box」後述するボックスが変形出来るようになります

Edit This Boxをクリックした状態

Scene画面を確認すると赤線の箱が表示されて居るのでこれを変形・移動させてメッシュがどうなるか確認してみましょう

左腕付近に移動

この様にコートのメッシュの一部のみが削除され、腕や胴体は残ったままになります
選択しているメッシュをHierarchyから変更したりすると表示が戻りますが、ゲームモードやVRChatへのアップロード時には削除された状態が反映されるので安心して下さい。
再度変更する時はもう一度「Preview」と「Edit This Box」から編集することができます


Merge Skinned Meshを使ってメッシュの数を減らしてみよう

いや、SkinnedMeshって何だ?コレやる意味あるの???
と、お思いの方
公式のドキュメントに以下の利点が記述されているので引用しますので読んでみて下さい

利点 
SkinnedMeshRendererを統合することでメッシュを変形させる処理の回数が減り、負荷が軽くなります。 また、同じマテリアルを使用しているマテリアルスロットも統合することができるので、描画負荷も減らす事ができます。

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

そう、負荷が減るのです
じゃあやるしか無いですね?やりましょう

アバターに入れてみよう

こちらは導入だけは簡単です

①Hierarchyのアバターのルートで右クリックして「Create Empty」をクリック
②作成されたGameObjectに任意の名前を設定し、GameObjectのInspectorの「Add Component」をクリックし、「AAO Merge Skinned Mesh」をクリック

①Hierarchyのアバターのルートで右クリックして「Create Empty」をクリック
②作成されたGameObjectに任意の名前を設定し、GameObjectのInspectorの「Add Component」をクリックし、「AAO Merge Skinned Mesh」をクリック

統合するSkinned Meshを設定しよう

AAO Merge Skinned Meshを追加すると以下の様になります

「Skinned Mesh Renderer」と「AAO Merge Skinned Mesh」が追加されている

それでは赤枠で囲った部分に統合したいSkinned Meshを指定して下さい!

・・・・え?面倒だし何がSkinned Meshかわからない?
安心して下さい、便利な機能があります

親の顔より見たVRChat SDK
もっと親のVRChat SDKを見ろ

VRChat SDKを開いて下さい
赤枠で囲った所がSkinned Meshの記述です
右側のSelectを押すと・・・?

Hierarchyでメッシュが全選択状態に!

Skinned Mesh Rendererが含まれる項目が全選択状態になります
選択された項目をさっきの追加する要素にドラック&ドロップして追加しましょう

Hierarchyで左クリックするとInspectorが変わってしまうので
この南京錠マークで固定しておくと便利です
操作が完了したら解除しておきましょう
ドラック&ドロップで追加した状態

注意点

無事追加出来て安堵したいところですがMerge Skinned Meshには注意しなければならない点があります

1.含めてはいけないSkinned Meshがある

Hierarchyの画像を見て気付いた方もいるかと思いますがVRChat SDKからSelectした場合Merge Skinned Mesh自身も追加されてしまいます
アップロード時にエラーが出てしまうので削除しましょう

今回の場合は「要素15」をクリックしてDeleteキー

もう一つこちらはエラーとはなりませんが公式から非推奨である事が明言されているSkinned Meshがあります
それは「Body」(顔)です
私が試して見たところ、MMDワールド対応アバターの場合顔をMergeしてあると表情が動かなくなりました
それ以外で確認はしていないので必要あれば追加したままでも問題ありません

2.アニメーション等でメッシュのON/OFFを指定している場合は動作しなくなる

メニューからアバターの小物等のON/OFFを設定している人がいるかと思いますが、Merge Skinned Meshを指定すると制御できなくなります(常時表示か常時非表示になります)
アニメーションの指定をしてあるメッシュはMerge Skinned Meshから削除してください

実際の効果を確認しましょう

では実際に数値が改善されるか確認しましょう

Merge Skinned Mesh設定前
Merge Skinned Mesh設定後

前後で比較すると
Skinned Mesh:15 → 2
Material Slots :16 → 6
と大幅に改善した事がわかります
描画周りの改善が期待される為是非設定しましょう


いかがでしたか?
AAOから個人的に代表的な軽量化手段を紹介しました
小さな改善によって同じワールドで過ごすプレイヤーのPCに優しくなれるこの軽量化改善、是非試してみて下さい


この記事が気に入ったらサポートをしてみませんか?