0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VRChat ワールドでアバターをアニメーションさせる

Posted at

やったこと

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

環境

・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でダウンロードしたものを使います。
image.png
アニメーションの設定でRigをHumanoidにします。
image.png
倒れるアニメーションの場合は、Root Transform Position(Y)Based UponをFeetにします。
image.png
アニメーターコントローラーを新規作成し、Create State -> EmptyでStateを作成します。
作ったStateでAdd BehaviourからVRC Animator Tracking Controlを追加します。
image.png
全てAnimationにします。
image.png
アニメーションを追加して次のようにつなげます
image.png

3. Stationの作成

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

パラメーターは以下のようにします
image.png

Animator Controllerは先ほど作成したもの、Seatedのチェックを外し、EnterとExit LocationにこのGameObject自身のTransformを指定しています。

今回はUdonで座らせるようにするので、プレイヤーが自分で座れないようにするため、Box ColliderをアタッチしてそのBox Colldierを無効にします。そうするとプレイヤーが触ることはできなくなります。
image.png

注意
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にします。
image.png
VRC StationをアタッチしたオブジェクトをCtrl+Dで複製します。
複製したオブジェクトのVRC StationAnimator 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に先ほど複製したオブジェクトを入れてください。
これで完成です。

参考記事

SDK3/SDK2両対応アニメーションを置き換えるワールドのVRCStationの作り方

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?