やったこと
ワールド内でアバターにアニメーションさせる
ここでは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
に先ほど複製したオブジェクトを入れてください。
これで完成です。