見出し画像

[VRChat]Unityによるアバター改変③ 軽量化編 ~後半~


前回の概要

前回の記事「[VRChat]Unityによるアバター改変② 軽量化編 ~前半~」では、私の軽量化に対する考え方に始まりアバターの最適化、Phys Bone Componentの削減までをご紹介させていただきました。

この記事では前半の続きについてご紹介させていただきます。
なお、軽量化のアプローチ方法についてはこれが正解、というものは無いと思っており、今回ご紹介するやり方(順番)はその一つとお考えくださればと思います。

今回も前回使用した表を引き続き使用します。 表については前回の記事「[VRChat]Unityによるアバター改変② 軽量化編 ~前半~」をご覧ください。

前回の結果

前回は Phys Bone Componentを43→16とするためにPhys Boneを削除、統合しましたが、ご覧のように Phys Bone Transforms などの項目が目標未達成となっていました。
この記事では上の表の "Result" の欄が赤くなっている個所を緑色(目標達成)にするために取り組んでまいります。

軽量化 ~つづき~

Step4 ~Boneの統合~

まずはじめにこの Step4 は、前 Step3 と対となる感じで検討していきます。効果が期待できる項目は、 Phys Bone Transforms、Phys Bone Collision Check Out (CC Count)、それと Bones です。
Step3と対となる感じというのは、今回の作業を行った結果、Phys Bone Componets の値(本数)が増えてしまうことがあるためです。

①Bone とは?

相変わらず他の有識者に頼ってしまって申し訳ありませんが、詳しくは「アバター ボーン」などで検索してみると詳しく説明してくださっている方がいらっしゃると思うので、そちらを参照してください。

私のイメージはアバターに通した骨(Bone)です。
その骨はどこで設定されているかというと、アバターや衣装などの "Amature" の部分です。 Amatureの "Transform" で位置などが設定されていて、ここが節になります。
また、その骨がどのくらいの柔らかさを持っているのかなどを設定するのがPhys Bone というイメージで考えています。
これらの設定値を参照してアバターが動いているという認識です。
※間違えていたらアドバイスしていただけますと助かります。

②Bone統合のアプローチ

まずプレイ動画を見て、動かしておきたい部位(パーツ)を考えます。
今回は
  ・前髪(Hair_Front)の一部
  ・横髪(Hair_side)
  ・横テール(Hair_tail)
  ・後ろ髪(Hair_back)
  ・耳
  ・スカートの前側
は動いて欲しいものとしました。
あえて「スカートの前側」としたのは、足を曲げたときにスカートも一緒に曲がって欲しいためで、横や後ろについては貫通やむなしと割り切りました。

③Boneの統合

さて、動かしたい部位(パーツ)の選定が終わりましたが、このままでは目標を達成できません。 Phys Bone Transforms などが達成しないのです。
そこで、Boneを統合してこれらの値を目標値になるように調整します。

Boneの統合には "AAO Merge Bone" を使います。
後ろ髪を例にとってご紹介します。
後ろ髪のBone(Phys Bone)構成はこのようになっています。

後ろ髪のBone(Phys Bone)構成

上の図で見える傘のような形が並んでいるのがPhys Boneで、傘がある場所にBone(節)が設定されています。
Boneの統合を行うということは、この傘を統合、例えば1本の連なった傘の一部を統合して傘同士の間隔を長めに取るイメージです。

Merge Bone

まず、髪のAmatureから該当する箇所(今回はHair_back)を選択して右クリックから "Select Children" を選択して展開します。

Hair_backの展開

上の図に示したBoneは "Hair_back_3_R" の "Hair_back_3_R.002" と "Hair_back_3_R.003" です。
これらの2つのBoneをctrlキーを押しながら選択した状態で "Inspector" の "Add Component" から "AAO Merge Bone" を選択します。

AAO Merge Bone

同じように他のBoneも統合していきます。

④前髪のPhys Bone処理

ライムちゃんの前髪のPhys Boneは1つにまとめられています。
そのため、「揺らす」か「揺らさない」かの2択となってしまいます。
しかし、プレイ動画を見て「揺らす」に設定した場合でもほとんど揺れていないBoneがあったり、やむなく「揺らさない」を選択したときにちょっと寂しかったので、「揺らす」箇所と「揺らさない」箇所に分けたくなりました。
このようなケースもあると思い、今回私がとった方法をご紹介します。

なお、この作業は Step3 の作業にあたります。
このように Step4 の確認中に思い直して Step3 に戻ることもありますし、 Step4 で思うような効果が得られない場合に Step3 に戻ることもあります。

前髪の揺れプランは下の図の感じにしようと思います。

前髪の揺れ設定

ライムちゃんの前髪のPhys Bone "Hair_front" を選択してコピー(選択した状態で ctrl+DでもOK)していきます。 コピーする数は、Boneで設定されている数と同じく8個です。 それぞれ自分でわかるように名前をつけます。
このとき、元々のPhys Boneは残しておいて非適用にしておくと事故が減ると思います。

Phys BoneのHair_frontをコピー

今コピーしたPhys Boneにそれぞれ対応するBoneを割り当てます。 そのとき、そのPhys Boneを揺らさない場合は "Inspection" の "VRC Phys Bone (Script)" のチェックを外しておきます。

コピーしたPhys BoneにBoneを割り当てる

個々で揺らし方を調整したい場合は、それぞれのPhys Boneのパラメータを調整することで可能です。
Phys Boneのパラメータについては前編でかるく触れていますので、よろしければそちらをご覧ください(ネットで検索すると、より詳細に解説してくださっている方がいらっしゃいますので、そちらをご覧になった方がいいかも?)

⑤Phys Bone Collidersの削減

Phys Bone Colliderは衝突判定箇所と説明されています。
たとえば、スカートと足を例にご説明します。
まず足を動かすとスカートの裾に近づいていきます。
あるところで足がスカートに触れ、そのまま動かしていくとスカートを貫通して足がスカートからはみ出ます。

スカート貫通

これを防止するために Phys Bone Collider を設定し、足がスカートに触れたと判定されたらスカートを足に追従させて曲げます。

スカート貫通なし

今回は、スカートの前側のColliderを残し、横、後ろ側のColliderは貫通やむなしとして削除(非適用)にしました。
このような作業を行うことで Phys Bone Colliders の数値を目標値に近づけていきます。

ご紹介した方法で都度確認を行いながら先の表にある目標値を達成するように調整します。

正直に言いますと、前回の Step3 と 今回の Step4 は結構時間がかかります。
Phys Bone を消してしまえば楽なのですが、やっぱり揺れものは出来るだけ残したいですよね…

以上で Step4 の作業は終了です。
結果を見てみましょう。

Step4結果

このような感じで動きます。

Phys Bone関連の目標が達成されました。
残っているのは Polygones です。
軽量化 Step ものこり2つとなってきました。

Step5 ~Polygonesの削減~

まずはじめにこの記事をご覧のみなさんにミスをご報告いたします。
これまでPolygonesの値が、Step2からStep3になった際に増えていました。
実はこの記事を執筆している途中で何度かプロジェクトを再作成しており、その際に "AAO Remove Mesh By BlendShape" を適用することを忘れておりました。それでも若干の違いはありますが、今回は下表からのスタートとなります。

Step4値修正

Polygones削減は以下の優先順位で進めます。
①BlendShapesの見直し / AAO Remove Mesh by BlendShape
②ポリゴンの部分削除 / AAO Remove Mesh in Box,
           Mesh Deleter with Texture
③ポリゴン数の削減 / Mantis LOD Editor with NDMF

①BlendShapesの見直し

Step1にて検討したBlendShapesをここでもう一度見直します。
「ここは見えなくてもいいかぁ」と思った箇所があれば追加してメッシュ(Polygones)を削減しましょう。

こちらの項目についてはStep1でやり方をご紹介しているので省略させていだきます。

②メッシュ(Polygones)の部分削減1

たとえば部分的に貫通してしまったりする場合、①では消せなかったメッシュ(Polygones)を部分的に削除します。

今回は特にこういったケースにありがちな、脇でやり方をご紹介します。

まずは "Hierarchy" から Bodyパーツ(ライムちゃんの場合は Body_Base)を選択して、"Add Component" から "AAO Remove Mesh in Box" を追加します。

AAO Remove Mesh in Boxを追加

追加された Remove Mesh in Box の "Preview" を押して(押すと "Preview" が "Stop Preview" に変わります)その下の "Edit This Box" を押すと、"Scene"に表示された赤い箱のサイズや位置を調整できます。
消したい所に赤い箱を移動させたら "Fisish Editing Box" と表示されている所を押します。
消したい箇所が複数ある場合、Remove Mesh in Box の "Boxes" の表の下の方にある「+」を押すと赤い箱を増やすことができるので、同じように消したい箇所に調整します。

Remove Mesh in Box 操作

Bodyに限らず衣装でもできますので、たとえば重ね着をするような場合で上着を脱がないのであれば(EXメニューから削除している場合など)インナー側に Remove Mesh を適用してメッシュ(Polygones)を減らすのも良いと思います。

③メッシュ(Polygones)の部分削除2

衣装のメッシュの一部分だけを削除したい場合、②のRemove Meshを使用しても構わないのですが、もう一つツールがあります。
それがこちらです。

ファイルメニューの "Assets" から "Import Package" を選択して、このツールをインポートすると、ファイルメニュー欄に "GatoTool" というメニューが表示されるようになります。
この "GatoTool" から "MeshDeleter with Texture" を選択するとウィンドウが表示されます。

たとえば今回の衣装の下駄紐を消したい場合を例にとってご紹介します。

表示された "MeshDelterWithTexture" のウィンドウの "Renderer" の欄に消したいメッシュが含まれた部位(パーツ)をD&Dすると、そのメッシュが含まれたテクスチャが表示されます。
上手く表示されない場合は何もせずに "Clear All Drawing" を押すときちんと表示される場合があります。

Mesh Deleter with Texture

ウィンドウにテクスチャが表示されると、黄色い●も表示されます。
この●で消したいメッシュ部分を塗りつぶすと、"Scene" 中でも実際に塗られた箇所の色が変わります。
なお、この●の色は変えられます(今回は緑色にしました)。

Mesh Deleter

思い通りの状態になったら、MeshDeleteWithTexture ウィンドウの右下のほうにある "Delete Mesh" を押します。
すぐ上にある "Revert Mesh to previously" を押すとやり直しができます。

直感的にメッシュを削除できるので便利ですが、一度決定してしまう(ウィンドウを閉じたり、他の箇所をDelete Meshしたりする)と元に戻せないのでご注意ください。

そのため、編集したいテクスチャをコピーして、そちらを割り当てた後に編集することをおすすめします。

④メッシュ(Polygones)数の削減

各部位(パーツ)は、メッシュ(Polygones)で構成されていて、形としては三角形(三角錐?)の形状となっています。
これまではこのメッシュを削除する方法をご紹介してきましたが、ここでは形状を保ちつつそのメッシュの数を削減(メッシュをまとめるイメージ)する方法をご紹介します。

使用するツールはこちらです。

このツールを使うためには Unity の Asset Store からツールを購入(有料です)する必要があります。

有料(決して安くはないです。ドルですし円安ですし…)なので気軽におすすめすることは出来ないのですが、メッシュ(Polygones)数を削減(軽く)するのは結構厳しいので、(衣装何着か我慢するかぁ…という葛藤の末)私は購入に踏み切りました。

まずは準備です。
"Scene"の右上にある"2D"の左隣にある丸っぽいアイコンをクリックして "Shaded Wireframe" 表示にして、メッシュを表示させます。

メッシュ表示

ここで前編「[VRChat]Unityによるアバター改変② 軽量化編 ~前半~」のダウンロードサイズを計算するツール、"VRCアバター/ワールド体重計(WeightScale)" の部分で触れたことについて振り返ります。
その中で「ダウンロードサイズに影響を与えているのは素体のポリゴン数が関係している」というお話をしました。

そこでここではBodyのメッシュを減らすことを例にしてやり方をご紹介します。

メッシュ(Polygones)を変更する部位(パーツ)を "Hierarchy" から選択して、"Add Component" から "NDMF Mantis LOD Editor" を追加します。
※検索欄に "LOD" または "lod" と入力するよりも検索欄を一旦消して、 "TexTransTool" を選択すると見つけやすいです。
"Mantis LOD Editor Professional" ではないのでご注意ください

NDMF Mantis LOD Editor追加

追加された "NDMF Mantis LOD Editior" の "Preview" を押して、すぐ上のシークバーで調整していくとメッシュの形が変わっていきます。
ある程度のところまで下げていくと形が変わったり、メッシュが消えてしまうので、やりすぎない程度に下げます。

メッシュ(Polygones)調整

やりすぎたなぁ、と思ったところで "NDMF Mantis LOD Editor" にある "Beautiful Triangles" のチェックを外してみましょう。

Beautiful Trianglesのチェックを外す

"Beautiful Triangles" は、「メッシュの形をきれいにする」という意味で解釈しています。 メッシュの形がきれいだからと言ってそれらが集まってできた部位(パーツ)の形もきれいになるとは限らない、という解釈です。

変更後のメッシュ数を確認しつつ、"Beautiful Triangles"のオン/オフやスライダーを調整して妥協できそうなところになったら "Stop Preview" を押します。

このツールもBodyに限らずメッシュが設定されている部位(パーツ)に適用できます。
適用する部位(パーツ)のコツとしては、
・Body
・足元の衣装類
・耳
・尻尾
あたりをうまく調整していく感じで、顔はできるだけ触らないようにしましょう(アニメーションで表情が変わるときにおかしくなるかもしれないので)。 また、他の方からよく見える場所はそのまま残すか、あまり減らさないようにすると良いかもしれません。

以上でStep5は終了です。
見た目に直結するので、目標値を少し下回る程度に抑えるのも一つの判断材料だと思います。

それでは結果を見てみましょう。

Step5結果

"Polygones"の数値が目標値を達成することができました。
また、ほんの少しではありますが、ダウンロードサイズも改善されています。

Step6 ~テクスチャの軽減~

Step5 でも触れた "WeightScale" の結果の中のもう一つ、「衣装や髪のテクスチャがダウンロードサイズに影響している」という点の対応です。

なお、この記事はliltoonを使用している場合で記載されています。 他のシェーダー(poiyomiなど)の場合は「テクスチャサイズ poiyomi」などで検索してみてください(すみません)。

テクスチャサイズの縮小 / lil Avatar Utils

liltoonを制作してくださったlilxyzw様が提供してくださっているツールです。 このツールを使用しなくてもテクスチャのサイズは変更できます。

テクスチャが含まれた部位(パーツ)を選択したときに "Inspector" に表示される "~(Material)" という欄にある "色設定" にテクスチャが表示されるので、これを選択します。

テクスチャの選択

すると、"Assets" にあるテクスチャファイルが選択されるので、これをクリックすると、"Inspector" にテクスチャが表示されます。
ここにある "Max Size" を変更して "Apply" を押すとテクスチャサイズを変更することができます。

テクスチャサイズ変更

1度にばっとやりたい、という方は lilAvaterUtils を使うとよいでしょう。

VCCからパッケージインポートされていれば ファイルメニューの "Window" から "_lil" → "AvatarUtils" を選択します。

lilAvatarUtilsの選択

ウィンドウが表示されますので、一番上の欄に "Hierarchy" からアバタルートをD&Dします。
するとそのアバターに使用されているテクスチャが一覧で表示されますので "Max Resolution" と書かれているすぐ下のBoxに数値を入力すると、その数値以上のサイズとなっているテクスチャが赤く表示されます。

サイズの大きなテクスチャ

今回は4096以上のテクスチャを赤くしました。
ここの数値を例えば 2048 とかにすると、それ以上のサイズとなっているテクスチャの数値が赤くなります。

今回は 10MB を超えている "Lime_Hair.png" と "JapaneseMaidRe_tex.png" のサイズを1段階(4096→2048)下げます。
"Max Resolution" のドロップダウンリストから "2048" を選択して、ウィンドウ左上の方にある "Apply" をクリックしたあと、一番上にあるルートアバターを入れた欄にある丸い矢印(リロード)をクリックすると反映されます。

テクスチャサイズの変更

先ほどの2つのテクスチャは 10.7MB でしたが、1段階下げる(4096→2048)ことで、2.7MB に減りました。
トータルテクスチャサイズも 56.2MB から 40.2MB に減りました。

このようにしてテクスチャサイズを小さくすることで、ダウンロードサイズも減らせます。

以上で軽量化作業は終了です。 お疲れさまでした。

まとめ

いかがだったでしょうか? 前編「[VRChat]Unityによるアバター改変② 軽量化編 ~前半~」冒頭でも書きましたが、今年(2024年)の夏にVRChatのアバター容量の制限値が下がることが発表されています。
また、イベントによっては特に指定はありませんが、多数(20人以上?)の方が集まるイベントではダウンロードサイズやテクスチャメモリが大きいアバターが多いと動作が遅く(重く)なったりしますので、必要以上の容量のアバターでの参加は少し控えてあげるといいかもしれませんね。

今回は特に触れていませんが、派手なパーティクルのギミックを仕込む場合も参加人数やそのイベントの主催の意図などを気にしてあげると他の参加者や主催(スタッフ)の方にやさしいかもしれません。
VRChatがやさしい世界になるよう、この記事が少しでもお役に立てたのなら幸いです。

おまけ

私はVRChat内では「無言勢」と呼ばれる振る舞いをしています。
無言勢について興味がある方はこちらの記事をご覧になるといいかもしれません。

そして無言勢の多くの方はペンを用いてコミュニケーションをとります。
ただ、中にはペンが設置されていないワールド(QVペンは結構重いので)もあり、無言勢の中にはペンを自前で用意する方もいらっしゃいます。
その一つに PPPen というものがあります。

有料なのですが、ワールドにQVペンが設置されていなくても、EXメニューから選択すると文字や絵が書けるようになります。
ただし、重い状態ではワールドとのリンクがとりづらく、書いた文字や絵がなかなか表示されない場合もあります(これはQVペンの場合も同じです)。

さて、今回の記事の「軽量化」に関連して、このPPPenについて簡単に触れておきます。

アバターを軽量化してPPPenをアバターに組み込むと、"Midium"にしたはずなのに "Poor" まで落ちてしまいます。

原因となっているのは "Total Max Particles" で、PPPenのデフォルトのParticle値は 2500 なので、そのような結果になってしまいます。

PPPenを導入して、かつパフォーマンスランクを "Midium" を保ちたい、という方は、パラメータの中の "Max Particles" の数値を 1000 などに下げましょう。
他のパーティクルも使用している場合は合計で 1000 となるように調整すると "Midium" 判定に戻ると思います。


今回の記事は以上です。
みなさん、VRChatの世界を楽しんでお過ごしください。

最後になりますが「アバター改変なんもわからん集会」のスタッフ運営の皆様には多大なる感謝を述べさせていただきたいと思います。

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