Modular Avatarで作る!アバターギミック ベストプラクティス

Modular Avatarという革命

Modular Avatar(以下MA)とは、非破壊でアバターに衣装を着せたりギミックを組み込んだりできるVRChatアバター向けツールです。衣装やギミック作者がこれでセットアップしておく事で、利用者は基本的にアバターに衣装やギミックのPrefabをポン入れするだけで着せ替え作業が完了します。

このMAの登場により、衣装やアバターギミックの配布方法は転換期にあると感じています。MAは今までに無い「非破壊」の特性がある事から、その使い方も他のツールとは大きく異なります。という事で、MAを使ったギミックを作る際の注意点を書き記していこうと思います。

MAで衣装着せ替えをする場合

自分がBlenderで着せ替えちゃうタイプなのと、本家ドキュメントを読めばほぼ終わるので、ここはあまり語れることはありません…ので、注意点だけ書きます。

衣装を着せ替える

MA Marge Armatureを使えば、同名ボーンが一つに結合される。逆に言うと、着せ替え先アバターのボーン名と、衣装のボーン名を合わせておく必要があります。

小物を付ける

ボーンが無かったり、人体ボーンに結合されると嬉しくないような小物の場合は、MA Bone Proxyを使います。こちらはターゲット(ボーン)の子オブジェクトとして階層移動してくれるものです。(ギミックの組み込みでも多用することになります)
ケモミミなどPhysboneが付いたボーンの子に入れる用途なら、MA Physbone Blockerも付けましょう。

MAでギミックを組み込む場合

前提として…VRChatのアバター(Avatars3.0)は、UnityのAnimatorに全力で依存した設計を取っています。Modular Avatarもあくまで「今まで手作業で・破壊的にやらざるを得なかったもの」を省力化するツールに過ぎません。つまり、Animatorの理解はそのままギミック制作の力になります。やっていきましょう。

Animatorコンポーネントについて

Animatorコンポーネントは1つのAnimator Controller(以下Controller)を持つ事ができて、このControllerの遷移条件に従って、どのAnimationClipを再生するかを制御する…という流れでアニメーションを実行します。
そしてAnimationClipは、"どの"オブジェクトの"何を"動かすのかがアニメーションキーとして記載されたファイルです。ここでオブジェクトの指定は、それが使われるAnimatorからの相対パスで表記されます。
これが意味するところは、AnimatorでアニメーションさせられるのはAnimatorの子孫オブジェクトのみ、という事です。Animator自体がモジュール構造的な考えで動くという訳ですね。

MAはControllerをどうアバターに組み込むのか

一方Avatars3.0はというと、アバターのルートオブジェクト(VRC Avatar Descriptorが付いたオブジェクト)に一緒に付いているAnimatorに、PlayableLayersにセットされた各種Controllerを"合体"させたものをセットして動かす、的な事をしています。つまり、アバターのルートを基点としたパスのAnimationClipでないと、正常にアバターギミックを動かせません。

これに対し、MA Marge Animatorはパスモードが"相対的"なら、このコンポーネントが付いたオブジェクトからの相対パスとしてAnimationClipを解釈したうえで、結合時にアバターのルートからの相対パスに変換します。これにより、MA Marge Animatorを付けたオブジェクトより上階層のオブジェクトを意識しなくても良い作りとなっています。

パスモードが”絶対的”の場合は、上記の変換処理はせずにControllerを結合します。これは既存ギミックのAnimationClipを流用するのには便利ですが、ギミックのPrefabを置く先のアバター階層やボーン名が異なると動かなくなる他、Prefabのリネームもできなくなる縛りが発生するため、配布ギミックには向かないので非推奨です。

ギミックを作る時のオススメの階層構造

前置きが長くなりましたが、以上をふまえた上で、どんな階層構造を持ち、どのようにギミック(のアニメーション)を作るのが良いのか、2パターン紹介します。

パターン1

マジオススメ。
本家ドキュメントではPrefab Variantを使ったネスト状のプレハブ構造が推奨されていますが、こちらのマトリョシカ構造(勝手に命名)を取るのが、MAを使わずに結合したい場合にも融通が利きやすいはずです。

このパターンで作る場合の注意点は

  1. まずMAは使わずに旧来ギミックのように、アバターのルート直下にギミックのPrefabとするオブジェクトを持ってきて、アバターのルートのAnimatorを使ってControllerとAnimationClipを作り、ギミックをPrefab化します。

  2. この際、Prefab外のオブジェクトをアニメーションさせないような作りにします。例えば手に追従させたいならParentConstraintを使い、ParentConstraintのSource用オブジェクトも用意しておいて、そのオブジェクトを手ボーンの子にするようセットアップしましょう。こうする事でアニメーション対象のオブジェクト階層を変えないまま、手ボーンに追従させる事が出来ます。

  3. 動作確認はテスト用アバターのAnimatorのControllerにセットして▶(再生)でもヨシ、FXレイヤーにセットしてGestureManagerやAv3Emuで確認するのでもヨシ。後者は必然的にExMenuとExParametersアセットも用意する事になり、この時点で非MA環境下に対応できる形です。

  4. ここからMA対応です。まず新たにPrefabを作り、その新規Prefabの直子としてギミックのPrefabを入れましょう。これがMA版Prefabとなります。

  5. あとはこのMA版PrefabにMA Marge Animator、MA Parameters等を付けていきましょう。
    PrefabではコンポーネントのRemoveをオーバーライドの形にできるので、2.で付けたParentConstraintはremoveしてMA Bone Proxyに置き換える手も使えます。

ParentConstraintで間接的に右手追従させる設定
マトリョシカ構造のMA対応

上記で作ったControllerは一見アバターのルートからの相対パスです…が、4.の対応により、MA Marge Animatorの直下にあるアニメーションとして使い回す事が出来ます。これにより、一つのControllerでMA対応と非対応両方のPrefabを用意することができました。

パターン2

こちらは完全にMAでの結合専用で作る事になります。
ぶっちゃけ本家ドキュメントそのまんまなので、引用して終わります。


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