やったこと
ワールド内でアバターにアニメーションさせる
ここではcubeをインタラクトすると死亡アニメーションが再生されて5秒後に復帰するものを作りました。

環境
・VCC (SDKバージョン3.1.10)
・U# 1.1.5
1. アバターのアニメーションを置き換えれるようにする
VRChatのワールドのSDKだけではアバターのトラッキングのアニメーションは上書きできないため、そのままだと手や頭がトラッキングされて想定通りのアニメーションをしてくれない。そのため、アバターのトラッキングを上書きできるようにする
方法
VCCでアバタープロジェクトを作成します。
アバタープロジェクトからPackages/com.vrchat.avatars/Runtime/VRCSDK/Plugins/VRCSDK3A.dllと
Packages/com.vrchat.avatars/Editor/VRCSDK/SDK3A/Components3/VRCAnimatorTrackingControlEditor.csをコピーします。
つまり以下の構造のフォルダを作ります。
com.vrchat.avatars
├─Editor
│ └─VRCSDK
│ └─SDK3A
│ └─Components3
│ VRCAnimatorTrackingControlEditor.cs
└─Runtime
└─VRCSDK
└─Plugins
VRCSDK3A.dll
作成したこのフォルダをワールドプロジェクトのAssets内に入れます。
2. アニメーションの作成
アニメーションをインポートします。今回はMixamoでダウンロードしたものを使います。

アニメーションの設定でRigをHumanoidにします。

倒れるアニメーションの場合は、Root Transform Position(Y)のBased UponをFeetにします。

アニメーターコントローラーを新規作成し、Create State -> EmptyでStateを作成します。
作ったStateでAdd BehaviourからVRC Animator Tracking Controlを追加します。

全てAnimationにします。

アニメーションを追加して次のようにつなげます

3. Stationの作成
空オブジェクトを作成してVRC Stationをアタッチします。
ワールド用とアバター用2つある場合はAPI Objectという項目がある方がワールド用のものです。(Controls Objectではない)

Animator Controllerは先ほど作成したもの、Seatedのチェックを外し、EnterとExit LocationにこのGameObject自身のTransformを指定しています。
今回はUdonで座らせるようにするので、プレイヤーが自分で座れないようにするため、Box ColliderをアタッチしてそのBox Colldierを無効にします。そうするとプレイヤーが触ることはできなくなります。

注意
Stationのパラメーターを編集した後は別のGameObjectを作るなどしてシーンに変更を加えてください。それをしないとシーンに変更が加えられたというフラグが立たず、パラメーターの変更が保存されません。
4. アニメーションを再生する
今回はCubeをインタラクトしたら再生するようにします。
Cubeを作成して位置とサイズをいい感じに調整します。
以下のUdonを書いてアタッチします。
インタラクトしたらアニメーションが再生されて5秒後に復帰するUdonです。
[SerializeField] VRCStation station;
public override void Interact()
{
station.UseStation(Networking.LocalPlayer);
SendCustomEventDelayedSeconds(nameof(EndAnimation), 5.0f);
}
public void EndAnimation()
{
station.ExitStation(Networking.LocalPlayer);
}
アタッチしたらスクリプトのStationパラメーターにStationをアタッチしたオブジェクトを入れます。
これで一応完成ですが、このままだとStationから降りても手などがトラッキングされないままになってしまうので、修正します。
5. Stationから降りた後にトラッキングを戻す
新たにアニメーターコントローラーを作成し、Stateを作成し、VRC Animator Tracking Controlを追加し、すべてTrackingにします。

VRC StationをアタッチしたオブジェクトをCtrl+Dで複製します。
複製したオブジェクトのVRC StationのAnimator Controllerを先ほど作成したものに変更してください、
手順4で作成したUdonを少し書き加えます。
[SerializeField] VRCStation station;
[SerializeField] VRCStation ResumeTrackingStation;
public override void Interact()
{
station.UseStation(Networking.LocalPlayer);
SendCustomEventDelayedSeconds(nameof(EndAnimation), 5.0f);
}
public void EndAnimation()
{
station.ExitStation(Networking.LocalPlayer);
ResumeTrackingStation.UseStation(Networking.LocalPlayer);
SendCustomEventDelayedFrames(nameof(ExitTrackingStation), 1);
}
public void ExitTrackingStation()
{
ResumeTrackingStation.ExitStation(Networking.LocalPlayer);
}
書き換えたら、スクリプトのResume Tracking Stationに先ほど複製したオブジェクトを入れてください。
これで完成です。
