基本的な使い方

基本的な使い方 #

自動最適化を使用する #

アバターには自動的に行える最適化がいくつかあります。

  • 使用していないBlendShape(シェイプキー)1の除去
    • BlendShapeの値が0以外のときは処理負荷が発生するため、値をアニメーション等で変更しないBlendShapeは固定すると負荷が軽くなります。
    • 値が常に0である場合でも、固定することでアバターの容量を削減することができます。
  • 使われていないPhysBone等の削除
    • 揺らす対象として存在するメッシュ2が常に無効になっているPhysBoneなどのように、揺らす必要のないPhysBoneが有効になっている場合は計算負荷が余分に発生してしまいます。
  • アニメーションしたりPhysBoneで揺らしたりすることのないボーンの統合
    • 服のボーンを素体のボーンに入れ子状にして着せるような場合には、それ自身を動かすことがないボーンが多く発生します。そのようなボーンは余分な負荷を発生させてしまいます。

AvatarOptimizerでは、アバターのルートにAAO Trace And Optimizeコンポーネントを追加するだけで、これらの最適化を自動で行うことができます!

add-trace-and-optimize.png

アバターをアップロードする #

AAO Trace and Optimizeコンポーネントを付けた状態で、試しにアバターをアップロードしてみましょう! AAO: Avatar Optimizerは非破壊改変ツールであり、Playモードに入るときかアバターをビルドするときに処理が行われるため、アップロードを行うのに特別な手順は必要ありません。 通常と同じように、VRCSDKのControl Panelからアバターをアップロードしてください。

ただし、Android(Quest)向けアップロードを行う場合などにおいて、Avatar Optimizerの最適化等によって制限の範囲内に収まるにも関わらず、VRCSDKのビルド前チェックの時点で制限を超過していてアップロードボタンが押せなくなっている場合には、以下の方法が使用できます。

  • Manual bake avatarを使用して生成したアバターをアップロードする。
    (アバターのGameObjectを選択した後、Unityウィンドウ上部のToolsから、NDM Frameworkの中にあるManual bake avatarを押す)
  • Sayamame-beansによるUpload without pre-checkを使用してアップロードする。

UploadせずにPerformance Rankを見る方法 #

非破壊改変ツールを使用した改変では、VRCSDKのControl Panel上のPerformance Rankはあてにならなくなります。

その代わりとして、Playモードに入った際のPerformance Rankをanatawa12’s Gist PackのActual Performance Windowを使用して確認することができます。 詳しくはanatawa12’s Gist Packの使い方およびActual Performance Windowのドキュメントを参照してください。

貫通防止用BlendShapeを利用してポリゴンを減らす #

服で隠れていたりして見えないような部分のメッシュを削除すると、見た目に影響させずに描画負荷やBlendShapeの処理負荷などを減らして軽量化することができます。 これを簡単に実現するために、AvatarOptimizerでは多くの素体に含まれている貫通防止用のBlendShapeを利用してメッシュを削除することができます!

素体のメッシュにAAO Remove Mesh By BlendShapeコンポーネントを追加しましょう!

想定外の部位が削除されてしまわないかを確認するためにプレビューのために切り替えたBlendShapeの値を自動的に変更するにチェックし、 削除したい部位の貫通防止用BlendShapeを下の一覧から選択しましょう!

消えて欲しい箇所が消えない場合や、消えて欲しくない箇所が消えてしまう場合には、許容差の値を調整する必要があります! 許容差は、頂点がBlendShapeによってどのぐらい動けば削除するかを決定するものです。 前者の場合は値を少し大きく、後者の場合は値を少し小さくしましょう!

remove mesh by BlendShape

メッシュを統合してMesh Renderersを減らす #

Avatar Optimizerを使用すると簡単にSkinned Meshを統合することができます! Skinned Meshを統合すると個別にオン・オフできなくなりますが、統合することで軽量化に繋がります!

なぜSkinned Meshを統合するの?

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

一番単純なパターンとして、Anonちゃんを軽量化してみます。

start.png

まず初めに、統合先のGameObjectを作りましょう。 アバターのGameObjectを右クリックから Create Empty をクリックして新たなGameObjectを作ります。 そうしたら、わかりやすい名前に変えておいてください。この記事ではAnon_Mergedとします。

create-empty.png

次に、Anon_MergedAAO Merge Skinned Meshコンポーネントを追加しましょう。

add-merge-skinned-mesh.png

するとAAO Merge Skinned MeshコンポーネントとSkinned Mesh Rendererコンポーネントが追加されます。 後者が統合先のメッシュになります。

統合したいメッシュをAAO Merge Skinned Meshコンポーネントに楽に指定するために、Anon_Mergedを選択した状態でinspectorをロックしましょう。 こうすることで複数のメッシュをまとめてドラックアンドドロップできるようになります。3

lock-inspector.png

それでは、顔のメッシュであるBody以外のメッシュをHierarchyで選択し、AAO Merge Skinned Meshコンポーネント内のSkinned Renderersにドラックアンドドロップで指定しましょう!

drag-and-drop.png

なせ顔のメッシュは統合しないの?

BlendShape(シェイプキー)は頂点数とBlendShape数の積に比例して重くなる処理です。 そのため、BlendShapeの数が多い顔のメッシュを頂点数の多い体のメッシュと統合するとかえって重くなってしまうため、顔は別のままにするのを推奨しています。

続いて、Anon_Mergedの設定をしましょう!

AAO Merge Skinned Meshコンポーネントは諸事情4により、ボーン、メッシュ、マテリアル、BlendShape、Bounds以外の設定を自動的には行いません。 そのため、統合先のメッシュ(AAO Merge Skinned Meshコンポーネントと同時に追加されたSkinned Mesh Rendererコンポーネント)にあるAnchor Override, Root Bone等の項目には別途手動で設定が必要です。 Anchor Overrideには素体(Body等)で設定されているものを、Root BoneにはHipsを指定すると上手くいくことが多いと思います。


  1. BlendShapeはUnity上のモーフィングの名前です。MayaではTarget Shape、BlenderではShape Key、MetasequoiaやMMDではモーフと呼ばれます。 ↩︎

  2. この記事でのメッシュは、UnityのMesh assetではなく、SkinnedMeshRendererやMeshRendererを意味しています。 ↩︎

  3. PhysBoneに複数のコライダーを指定したりするのにも使えます。色んなところで使えるので覚えておくと便利だと思います。 ↩︎

  4. Root Bone/Anchor Overrideは等しくないと統合できないため対応予定がありません。もし良いアルゴリズムがあれば教えてください。 ↩︎