🍥

UnityでVeryPoorでも軽量アバターにする【VRChatアバター軽量化】

2024/09/28に公開

目的

VRChatのアバター容量を軽量化していく。
あくまで容量を減らすのであり、アバターパフォーマンスランクについては度外視する。
また、使うツールはすべて無料のものでunityのみで完結させる。

アバターパフォーマンスランクについては公式のドキュメントを参照。
https://creators.vrchat.com/avatars/avatar-performance-ranking-system/

まずは自分のアバターを見直す


自分のVRChat改変アバター好きかい?大好き!そんなアバターが、実は超激重容量ロード長時間アバターになっていたりしませんか?これは記事のために用意した大変かわいい改変ルーナリットですが、アバター容量はこんなことになっています。

見ての通り超激重容量ロード長時間アバターです。HDDに保存したUnityProjectという前提もあるものの、アップロードに15分掛かったので、Very Poorを凌駕するLegendary Poorと言っても差し支えないでしょう。※いくら重いアバターがいるからといって人に向かってLegendary Poorと言うのは悪口なのでやめましょう。

近年販売されているアバターや衣装はポリゴン数が多いものが増えたので、Poor, Mediumといったアバターパフォーマンスランクにすることは非常に困難です。なのでVeryPoorアバターでも使わないメッシュやPBをしっかり無効にしたり、テクスチャ容量を抑えるといった軽量化で「不必要に重容量アバター」から「Very Poorでも軽いアバター」になりましょう。もちろんアバターアップロードも早くなります。

Unity2022以降のVCCもしくはALCOMとModularAvatarを使用してることを想定して進めていきます。全部無料で配布されているツールで行っていきます。すべてのツール開発者に感謝を。

必要なもの

使い方はリンクから確認しましょう。

  • AvatarOptimizer 通称AAO
    軽量化にすごく便利なやつ。メッシュやシェイプキー、PBを自動で減らしてくれる。
  • anatawa12's gists pack
    Unity内でアバターのパフォーマンスランクを確認しやすくなるやつ。
  • Flare's (Avatar|World) Tools
    テクスチャ軽量化がお手軽になるやつ。
  • GestureManager
    Unity内でアバターの表情やRadialMenu、ロコモーションなどの動作テストができるやつ。 
     VCCとALCOMのデフォルトでVPMに入ってるのでManage Packagesから導入してください。
     Add Componentから「ge」で検索して選択することでhierarchyに追加されます。

AAO Trace And Optimize

この改変は全身使わない衣装や小物メッシュを見えないようにしています。ただし、あくまで「見えてない」だけでアバターの計算上は全てのメッシュやPBが反映されてるのでこの重さになっています。ルーナリットちゃんにリーファちゃんまりえるちゃんの服を着せてるので、ルーナリット本体+リーファまるえる2体分のデータ+ガーター靴下靴バッグそれぞれ衣装セット3着分のデータという莫大な量になっているのであの容量になっています。それらをまとめて反映しないようにできるのがAAOの「Trace And Optimize (T&O)」です。hierarchy上の改変アバターをクリックしてAdd Componentから「AAO」で検索し「Trace And Optimize」を選択してください。

使われていないObject=非表示にしたメッシュのことです。最初からアバター軽量化に必要な設定が反映されているので、これだけで「アバターから非表示にされたメッシュとそれに紐づくPB」を最適化し、不必要なデータを整理してくれます。また、「BlendShapeを自動的に固定・除去」のおかげでアバター容量も削減されるので目に見えてアバターの容量が減ります。(詳しくないけどポリゴン数×BlendShapeの数も容量として計算されるそうなので少ない方が軽くなる模様)

分かりやすくT&Oをつけたものとそうでないものの数値を並べてみました。歴然とわかるその差。

AAO Merge Skinned Mesh

T&Oだけでは満足できない軽量化の次はすべてのメッシュを結合して1メッシュにします。Add ComponentからMerge Skinned Meshを追加し、操作しやすくために一度Inspectorの鍵マークをクリックしてロックを有効にします。

改変に使用したメッシュをすべて「追加する要素」のところにじゃかぽこ入れていきましょう。メッシュの数は少なければ少ないほど読み込むものが減るので軽いモデルということになります。編集が終わったらロックを解除してください。

Skinned Meshの項目でBounds,RootBone,AnchorOverrideを設定するのを忘れずに。ばうんず?るーとぼーん?あんかーおーばーらいどって何?unityの説明を見ても専門的な内容で本当によくわかりません。自分の中では画像の通りに認識しています多分間違ってない。

Flare's Avatar Tools AvatarTextureTool

アバター容量削減に最も分かりやすく数字が変わるもの、それはテクスチャです。こちらもまとめて軽量化しましょう。UnityのToolからwhiteflare、AvatarTextureToolと選択して、Root Objectに改変アバターをD&Dします。そうすると改変に使用しているテクスチャが全て表示され、VRAM(テクスチャメモリ)も反映されます。

細かいことを考えずにざっくり軽量化するのであれば、どれか1つテクスチャをクリックしてから「Ctrl+A」で全選択にし、Max Sizeを1024にしてwindow内のApplyをクリックしましょう。

なんとテクスチャメモリが100MB未満になりました。しかもこの数字はすべてのテクスチャが有効になっている状態での数値なので、GestureManagerで確認すると、なんと51MB。元の数字から4分の1よりもさらに減りました。素晴らしい・・・。

ここでは手早くわかりやすさ優先で一律1024にしましたが、ネックレスや靴といったまじまじと見ない小物や視線から遠いアイテムは512や256まで縮めても問題ありません。透過でレースを使用したテクスチャや顔テクスチャは高解像度に留めるなど、好みで調整してください。

解像度を落としたことでガビガビしている・・・そんな時はテクスチャのCompressionをHigh Qualityにしてください。全身やる必要はなく、目立つところだけ設定しておけば大丈夫です。若干容量は増えるものの、2048や4096テクスチャを使うよりはずっと軽いです。

デフォルトからテクスチャ改変をしている場合、マテリアル設定に「メインテクスチャは色変えしたもの、輪郭線テクスチャはデフォルトのもの」といった状態のものがあったります。そういうのもAvatarTextureToolから確認して差し替えたり削除しましょう。英数字順にソートして形は同じ、色は違うといったテクスチャがあればちょっと怪しいです。右クリックから使用してるマテリアルを確認できます。マテリアルがlilToonの場合、輪郭線や2ndテクスチャに入ってないのに設定されてる…といった場合マテリアル項目の最適化から「未使用のテクスチャを外す」で消えることが多いです。うまくいかなかったらごめんなさい。

徹底的にアバターを軽くするなら全身のテクスチャを256にするという手段もあります。そこまでやったら見た目がヤバいのでは?と不安になる方もいると思います。VRChatに解像度別でアップしたサンプルアバターワールドを用意してあるので、見た目や軽さをお試しください。
https://vrchat.com/home/world/wrld_2b36fc3a-bf6a-446f-85db-e9671237b477

アップロード前の確認

かなり削減できましたが、アップロードする前にもう一度GestureManagerで「結合し忘れたメッシュがあるか、使いたいギミックが正しく動くか、使うつもりがないアバターギミックが動いたままになってないか」などを確認しましょう。

今回確認したところ「バッグのメッシュをマージしていない」「使わない傘が有効状態になっている」「FXレイヤーのギミックが反映されているのでsocksのメッシュが有効になっている」などがあったので、今回はそれぞれ選択してTagを「EditOnly」に変更して無効にしました。

着せ替えギミックやパーティクルギミックなどを使いたくない場合、衣装やアバター側のFXLayerから関係してる項目をDeleteするやり方もあります。ただしこれらはExpression MenuやExpression Parameterを編集する必要もあるので、私は面倒くさく感じます。なのでEditOnlyで済むものはなるべくそうしてます・・・。抜ける手はどんどん抜きたいので説明は省きますが、もし編集するなら必ずFXレイヤー、Expression各設定ファイルをコピーして、コピーしたものをアバターに設定してから編集を行いましょう。元の設定ファイルは必ず残しましょう。

AAO Remove Mesh By BlendShape


ついでに、服の下に隠れる素体部分も消します。素体メッシュを選択しAdd ComponentからRemove Mesh By BlendShapeを追加して、胴体腰回り、靴下の下などに当たる部位を消していきます。

アバター軽量化ビフォーアフター

不要なメッシュ、ボーン、PBの無効化、テクスチャ容量ポリゴン数を減らすといった軽量化を行いました。超激重容量ロード長時間アバターはどのように変貌したでしょうか。画像をクリックで拡大できます。
圧倒的!圧倒的軽量!ベリプでも軽い!アップロード時間は3分!VRChat上でアバター読み込みも早い!!数字だけが軽くなったと思われるかもしれませんが、各項目が軽くなることで他のユーザーから見た時の負荷というのは大きく変わります。つまりアバターが軽いと人とPCとHMDと消費電力と地球環境にも優しいということですね。それとVRChatイベント運営陣にも優しくなれます。「運営スタッフやキャストがインスタンスの重さに耐えきれず落ちてしまい戻ってこれない」というケースを一人一人の軽量化で未然に防ぐことができます。「イベント参加にアバター容量制限が課される」というのはそういったことです。普段から軽量化しておけば色んなイベントに遊びに行きやすくなれますね。

内容としては以上です。
お金を使ってでもアバターランクを上げるぐらいに軽量化するぞ!といった気合いのある方はこちらを参考にしてください。
https://narutoya.fanbox.cc/posts/7995121
Zennにはこの記事で端折った部分をちゃんと書いたものをいつかそのうちおそらくアップしたいなと思っています。

おまけの小技?基本?

アバターアップロード画面でたくさんSelectが並んでますよね。例えばPhys Bone ComponentのSelectを押すとアバター内で有効・設定されてる箇所がバーッと強調されます。

上で確認方法を紹介しましたが、自己流だと主にこれを使ってメッシュやPBの確認をしてます。ボーン内に仕込まれた小物系のメッシュを見落としやすいのでこの確認方法はおすすめです。

また、改変の工程で使わないメッシュやPBを設定されたボーンを非表示にする際にTagをEditOnlyにして無効化も同時にやっておくやり方もしてます。個人的にはこの方が見落とし箇所も確認しやすいですが、この辺は好みです。

使用モデルクレジット

https://hyuuganatu.booth.pm/items/3390339
https://hyuuganatu.booth.pm/items/3659436
https://hyuuganatu.booth.pm/items/4063740
https://dot-st.booth.pm/items/5086300
https://serasera.booth.pm/items/5486948
https://tempasta.booth.pm/items/5608274

Discussion