SDK3/SDK2両対応アニメーションを置き換えるワールドのVRCStationの作り方
執筆時点での環境
Unity2019.4.29f1
VRCSDK 2021.08.11.15.16
注意
VRCStationのアニメーション設定(特にトラッキングを変更する場合)は、エディタ機能にバグがあるのか微妙に安定していません。この設定によってプロジェクトが壊れてしまう可能性がないとは言い切れないので設定は自己責任でお願いします。
アニメーションを置き換える(トラッキングを変更しない)
VRCStationに座った時にアニメーションを置き換えますが、アバターのトラッキングモードを変更しない場合の作り方。通常の座り姿勢を変更したりに使います。
まず、プロジェクトを作成しVRCSDK-WORLDをインポートします。
次に、シーンに適当な床とVRCWorld、VRCMirrorを置いて、ワールドとして最低限の構成にします。
次に、VRChat Example/Prefabs/VRCChair
から、VRCChair3
をシーンに追加します。
(超重要) VRCChair3を右クリックして、Unpack Prefab
を押し、Prefab状態を破棄します。
Prefabを崩す理由なのですが、なぜかVRCStationのコンポーネントの変更がPrefab状態だと保存されず、ビルドしたりシーンを開き直したりすると状態がリセットされてしまうためです。
次に適当なアニメーションをプロジェクトにインポートします。ひとまず、Mixamoで生成したダンスモーションをインポートします。
アニメーションの設定で、RigをHumanoidに設定します。
次にAnimatorControllerを新規作成して、アニメーションをAnimatorControllerに追加します。
VRCChair3のVRC StationのAnimator Controller
に作ったAnimation Controllerをセットします。
Player Mobility
をImmobilize For Vehicle
、Can Use Station From Station
をオフにします(ココが必須がどうかはまだ不明で現在調査中)。
(超重要) この時点で新たにGameObjectを追加します。このGameObject自体に特に意味はないのですが、VRC Stationの設定は変更されても、シーンが変更されたというフラグが立たないのか、このままだと変更が保存されません。
そこで新たにGameObjectを置いたり、シーンの別のオブジェクトを変更して変更フラグを立てます。そうすることでVRCStationの設定も保存されます。ポイントはHierarchyのシーンの表記に*
がついて編集済であるかチェックすることです。
ビルドしてワールドに入って椅子に座ると、アニメーションが変わっているのを確認できます。
ただ、この状態だとVRモードなどだと手や足はコントローラーにトラッキングされたままになります。デスクトップモードの場合は頭なども固定されてしまいます。次にそれらもすべてアニメーション制御する方法を解説します。
アニメーションを置き換える(トラッキングを変更する)
VRChatのアバターは頭・腕・足などはVRコントローラーやヘッドセット・トラッカーに追従するTracking状態と、アニメーションによって制御されるAnimation状態の2つがあります。VRCStationにアバターを座らせた場合、アニメーション置き換えはこのAnimation状態に影響を与えます。そのため、Tracking状態の部位は、VRCStationに座らせてもアニメーションを変更することができません。 そのため、全身を動かすダンスモーションを設定しても、Trackingに取られてうまくアニメーションしてくれません。
Trackingをオンオフするには、VRCSDK-AVATARが必要になります。
VRCSDK-AVATARのインポート
ここまでのプロジェクトに新たにVRCSDK-AVATAR
をインポートしますが、全てインポートしてはいけません。必要なもののみインポートします。全てインポートするとローカルテストができなくなりました。
パッケージのインポート画面になったら、まずControlPanel内のVRCSdkControlPanelAvatarBuilder.cs
のチェックを外します。
AvatarValidation.cs
のチェックを外します。
PluginsのVRCSDK3A-Editor.dll
のみチェックを外します。
Sample AssetsのMirrorReflection.mat
のチェックを外します。
SDK3A
フォルダの中は、VRCAnimatorTrackingControlEditor.cs
のみ残して、それ以外すべてのチェックを外します。
ここまででインポートを押します。
つまりVRCSDK3A.dll
とVRCAnimatorTrackingControlEditor.cs
のみインポートします。
アニメーターの設定
作ったアニメーターに新たにStateを作成し、以下のようにつなぎます。
作ったStateに対してAdd Behaviourから、VRCAnimatorTrackingControlを選択します。
Tracking Controlの設定を全てAnimation
にします。
シーンのVRCStationのSeated
のチェックを外します。
(重要)適当な別のオブジェクトを弄って、変更フラグを立て、ビルドします。
これですべてのトラッキングが外れます。
ただこの状態で椅子から降りると、トラッキングが外れたままの状態になってしまいます。この場合は、アバターをリセットするか、別の椅子を作成し、そちらのVRCAnimatorTrackingControlを全てTrackingに設定して、その椅子に座り直すことで設定を元に戻せます。Udonを使ってこの工程を自動化してもよさそうです。
(おまけ)ダンスモーションがその場で動くような見た目になってしまうのの修正
これはダンスモーションが、ルートモーションの使用を前提としたアニメーションであるため、ルートモーションがオフになるVRCStationのアニメーションではうまく動作しないためです。なので、ルートモーションなしでちゃんと動くアニメーションにする必要があります。 有料アセットですが、UMotion Proはアニメーションのルートモーションをキャンセルする機能があるのでそれを使ってみるとよいかもしれません。