跳到正文
Qiita · Unity 开发社区· 来源· bet7y·· 1 天前AI 评分13

Unity VRChat 教程:利用 Animation 实现 Avatar 坐姿判定开关

【発展】アバター Sit 判定で学ぶ Animation

正文 · 原文

はじめに

前回は、MA のみを使ってギミックを実装しました
前回記事

今回はこの続きとして、MA のみでは実装できないギミックを実装します

Animation に詳しくない方の Animation 入門記事にもなれるように、手順重視で、必要な部分のみをできる限り丁寧に説明しました

実装例の UnityPackage は、以下で配布しています。参考にしてください
GitHub

Booth

椅子の有効・無効を切り替える (オンオフする)

こちらの Animator Controller を使う方では、椅子をオフにしたとき

  • 座っていた人を降ろし、以降誰も乗れないようにする (前回解説した MA Object Toggle と同じ)
  • 既に座っている人は降ろさず、その人が自分で降りた後に誰も乗れないようにする (こちらでのみできること)

を選べます!

これは、コンポーネント単位で有効・無効を変更できるからです。

以下では、こちらの Animator Controller を使う方式でのみできる後者を実装します

ファイルを置くためのフォルダを作る

Project タブにて、Assets フォルダ以下で右クリックして、「Create > Folder」で今回改変しているアバター用のフォルダを作成してください
image.png

その際、自分で作成したファイルを一括管理するために

Assets
└─ _MyAssets
   ├─ アバター 1 用フォルダ
   ├─ アバター 2 用フォルダ
   └─ ...

のように、_MyAssets のようなフォルダを作成して、その中にアバターごとのフォルダを作るのがおすすめです

こうすれば、次のように一つのプロジェクト内にアバターが増えても管理しやすいです
image.png
筆者が実際に使っているルルネちゃんの改変プロジェクト内の様子

今回は Assets/_MyAssets/アバター椅子 内でファイルを作成します。

みなさんが今回改変しているアバター用に作ったフォルダに相当するのが アバター椅子 フォルダです。
以下では、画像を参考にしつつ適当に読み替えてください

Animation に必要なフォルダとファイルを作る

まず

  1. Animation Clip をまとめて管理するフォルダ
  2. Animator Controller
  3. Expression Menu
  4. Expression Parameter

を作ります
image.png

この作り方は、フォルダを作った時と同様に

  1. Create > Folder
  2. Create > Animator Controller
  3. Create > VRChat > Avatar > Expression Menu
  4. Create > VRChat > Avatar > Expression Parameter

で作成します
スクリーンショット 2026-11-01 185616.png

Expression Menu (以下、ExMenu) と Expression Parameter (以下、ExParam) は同じ名前にできません。
両方とも拡張子が .asset であり、ファイルパスを区別できなくなるからです。

おすすめは、ExMenu は「<改変しているアバター名>M」、ExParam は「<改変しているアバター名>P」とすることです。

画像では次のようにしました

  • ExMenu: AvatarChairM
  • ExParam: AvatarChairP

次に、先ほど作った「Animation Clip をまとめて管理するフォルダ」を開いて、2 つの Animaion Clip

  • BoxCollider_Off
  • BoxCollider_On

を作ってください。

他の Animation Clip と区別したい場合は AvatarChair_BoxCollider_Off のような命名もおすすめです

これらの作り方はこれまで同様、Project タブを右クリックして「Create > Animation」です
image.png

Animation State Machine の概形を作る

作成した Animator Controller をクリックして、Animator タブを見てください。

画像の赤い丸で囲った+マークを押して Animation Layer を追加してください。
スクリーンショット 2026-11-01 213448.png

画像では Animation Layer の名前を AvatarChair_BoxCollider に変更しています

作成した Animation Layer 右側の image.png を押して、Weight を 1 に設定してください
image.png
作成した Animation Layer 名下部のバーが右端まで明るくなっていれば正しく設定されています。

右側 (方眼) の何もないところを右クリックして「Create State > Empty」で Aniamtion State を追加してください
image.png

最初に追加したステートが、画像のように Default State (オレンジ色) になります

Project タブの

Packages/com.vrchat.avatars/Samples/AV3 Demo Assets/Animation/ProxyAnim/

から、proxy_empty を見つけ
image.png

画像のように、サムネイル無しでリスト表示したい場合は、Project タブ右下のスライドバー image.png を左端に設定してください

先ほど追加したステートの Inspector にて Motion にドラッグアンドドロップしてください
image.png

ステートをクリックすると、違った Inspector の表示になることがあります。
そのときは他のステートをクリックして再度追加したステートをクリックしてください。何回かやれば直ります

次に、「Animation Clip をまとめて管理するフォルダ」を開き、先ほど作成した

  • BoxCollider_Off
  • BoxCollider_On

を Animation State Machine にドラッグアンドドロップしてください
image.png

画像では先ほど追加した Animation State の名前を Buffer に変更しています

Buffer ステートを右クリックして、Make Transition を選択してください
image.png

矢印がマウスを追従している状態で、BoxCollider_Off ステートをクリックしてください
image.png
画像のように、マウスを離しても Buffer から BoxCollider_Off へ矢印が伸びていれば成功です。

同様に 3 つの矢印

  • Buffer から BoxCollider_Off へ
  • BoxCollider_Off から BoxCollider_On へ
  • BoxCollider_On から BoxCollider_Off へ

を作成してください。
image.png
なお、矢印の向きに十分注意してください

この矢印があることで、Animation State から別の Animation State に遷移でき、それぞれにアタッチした Animation Clip が再生されることで、アバターの状態を変えることができます。

「Animation」によって「状態」を管理する「機構」だから Animation State Machine と言うのですね

Animation Transition の設定

Animation Transition (矢印) をそれぞれ選択して、全てについて

  • Has Exit Time: オフ▢
  • Transition Duration: 0

に設定してください
image.png

このとき Exit Time を 0 に設定する方がいますが、今回は値を変更する必要はありません。
Has Exit Time を False にしているため、Exit Time の値は使われないからです。

もちろん Exit Time を 0 に設定しても動作に影響はないので、0 に設定してもかまいません

上の画像において、今回使わない Animation State である Any State と Exit を左側にまとめました。
ドラッグして移動しただけであり、機能に影響はありません

Animator タブ左上の Parameters を選択し、+マークを押して、Bool を選択してください。
image.png
画像では Parameter 名を IsBoxCollider に変更しています。

Buffer から BoxCollider_Off への遷移を選択し、Inspector の Conditions 右下の+マークを押してください
スクリーンショット 2026-11-03 165719.png

追加された行の左側を IsBoxCollider に設定し、右側を false に設定してください
image.png

同様に、BoxCollider_On から BoxCollider_Off への遷移の Conditions にも「IsBoxCollider false」を追加してください
image.png

今度は、「Buffer から BoxCollider_On へ」の遷移の Conditions に「IsBoxCollider true」を追加してください
image.png

同様に、「BoxCollider_Off から BoxCollider_On へ」の遷移の Conditions に「IsBoxCollider true」を追加してください
image.png

このように設定することで、トグルを操作して IsBoxCollider の値が切り替わり、IsBoxCollider の値で条件付けした遷移が行われ、目的のステートに遷移するようになります

Expression Parameter の設定

Project タブで前に作った ExParam を選択して、Inspector を見てください。

作成後のデフォルト状態では 3 つのパラメータがありますが、これらは使わないので、右下の - マークで削除してください
スクリーンショット 2026-11-03 172031.png

次に、+マークを押してパラメータ IsBoxCollider を追加してください
スクリーンショット 2026-11-03 172203.png

必ず Animator Controller の Parameters に追加したパラメータと 完全に一致 するパラメータ名を設定してください。
大文字小文字、スペースや記号の有無など、少しでも異なると動作しません。

心配な方は、コピペや下で紹介する Copy from Animator をご利用ください

その際

  • Type: Bool
  • Saved: オン✅
  • Synced: オン✅

に設定してください

Default について、オン✅でもオフ▢でもお好きな方を設定してください。

オン✅なら、アバターのデフォルト状態で Sit 判定が有効化された状態になります。
アバターリセット後において、トグルが有効化された状態になり、無効化するために操作が必要になります。

オフ▢なら、アバターのデフォルト状態で Sit 判定が無効化された状態になります。
アバターリセット後において、トグルが無効化された状態になり、有効化するために操作が必要になります。

Exprassion Menu の設定

Project タブで前に作成した ExMenu を選択して、Inspector を見てください。

Parameters の欄に、先ほど設定した ExParam をドラッグアンドドロップしてください
image.png

Controls 右下の + マークを押して、追加された行の右側のドロップダウンから Toggle を選択してください
スクリーンショット 2026-11-03 174028.png

Name にお好きなトグル名を設定し、Parameter のドロップダウンから IsBoxCollider, Bool を選択してください
image.png

コンポーネントの追加

前回の記事で作成した親オブジェクトに 4 つのコンポーネント

  • Animator
  • MA Merge Animator
  • MA Menu Installer
  • MA Parameters

を追加してください
image.png

コンポーネントの設定

作成したファイルを、次の表に従ってそれぞれドラッグアンドドロップしてください

アタッチするファイル アタッチ先のプロパティ
Animator Controller Animator コンポーネントの Controller
(上と同一のもの) MA Merge Animator コンポーネントの 統合されるアニメーター
ExMenu MA Menu Installer コンポーネントの「プレハブ開発者向け設定」の インストールされるメニュー
ExParam MA Parameters コンポーネントの アセットからインポートする

image.png

その他のプロパティについて、

  • Animator コンポーネントの Apply Root Motion: オフ▢
  • MA Merge Animator コンポーネントの 付属アニメーターを削除: オン✅
  • MA Merge Animator コンポーネントの アバターの Write Defaults設定に合わせる: オン✅

に設定されていることを確認してください

みなさんのアバターにおいて、MA Menu Installer の インストール先 が上の画像と異なり、ExMenu が自動でアタッチされている可能性が高いです。

その場合は、その ExMenu がアタッチされたままにしてください

Animation Clip の録画

Animator コンポーネントを追加した Game Object を選択してる状態で Animation ウィンドウを見てください。
Animation ウィンドウは、Unity 画面上部から「Window > Animation > Animation」で表示できます

image.png

まず、Animation ウィンドウ左上のドロップダウンから BoxCollider_Off を選択してください
image.png

image.png を押して録画モードに移り、Game Object の Inspector にて Box Collider コンポーネントをオフ ▢ にしてください
image.png

image.png を押して録画モードを終了してください
image.png

このときアバターが T ポーズ以外のポーズをとっていたり、体だけ下方に移動している場合は、image.png を押して Preview モードを終了すれば元に戻ります

ウィンドウ上部のタイムラインは「〇秒目:〇フレーム目」を表しています。
サンプリングレートは毎秒 60 フレームであるため、例えば

  • 0:00 は 0 秒目の 0 フレーム目 (開始時点)
  • 1:30 は 1 秒目の 30 フレーム目 (1.5 秒時点)

を表しています。
「0 分 0 秒時点」や「1 秒 30 ミリ秒時点」ではありません

Animation ウィンドウを拡大して、1 フレーム目が見える状態にしてください
image.png

その際次のように、ウィンドウ右側の領域を横方向に潰して再度広げると、楽に拡大できます

1. ウィンドウ左側の辺を右端までドラッグ 2. 元の位置に戻す
image.png image.png

0 フレーム目のキーフレーム image.png をクリックして image.png にした状態で、Ctrl + c でコピーして
image.png

1 フレーム目に再生ヘッドがある状態で Ctrl + v でペーストしてください
image.png

このコピペ操作が上手くいかない場合は、1 フレーム目において先ほどの録画操作を再度行ってください。
0 フレーム目と 1 フレーム目に同じ設定値のキーフレームがあることが重要です

次に、Animation ウィンドウのドロップダウンから BoxCollider_On を選択してください。

先ほどと同様、再生ヘッドが 0 フレーム目にある状態で録画ボタンを押し、
Box Collider コンポーネントのチェックボックスを今回は 2 回クリックしてください
image.png
こうすることで、チェックボックスがオン ✅ 状態のキーフレームを作成でき、Box Collider を有効化する Animation Clip を作ることができます

先ほどと同様、1 フレーム目 image.png が見えるように拡大して、0 フレーム目と同じキーフレーム image.png を 1 フレーム目に作ってください
image.png
コピペ操作は録画モード中 (タイムラインが赤い状態) に行っても問題ありません。

キーフレームの値を確認するときは、当該フレームに再生ヘッドを移動させてください。
例えば、1 フレーム目のプロパティ (Box Collider.Enabled) の値が ✅ になっているかを確認するときは、次のように再生ヘッドが 0:01 にある状態にしてください。
image.png

次のように、0:01 のキーフレームが選択されていても、再生ヘッドが 0:00 にあるなら、プロパティは 0:00 時点の値を表示しています
image.png

以上で「既に座っている人は降ろさず、その人が自分で降りた後に誰も乗れないようにする」機能の実装は終了です。お疲れさまでした。

ギミックの動作確認について、Unity 上であれば Gesture Manager を使うこともできますが、
VRChat 内で

  • トグルを ON にしたとき、椅子が座れるようになっているか
  • 既に座っている状態でトグルを OFF にしたとき、座っている人が強制的に降ろされないか
  • トグルを OFF にして、座っている人が下りた後、新たに座れない状態になっているか

などを確認するときは、下の記事の方法を使うと一人で手軽に行えます!

座る位置をゲーム内で動かす (複数レイヤー)

VRChat 内で 2 つの Radial Puppet を操作することにより、座る位置を前後と上下に動かせるギミックを作ります。
このギミックがあると、肩車の位置や膝など、いろいろな位置に柔軟に座らせることができます。

実装作業のうち前章の内容と被る部分は説明を省略しつつ、2 つの実装を並行して行います

Animation に必要なファイルを作る

「Animation Clip をまとめて管理するフォルダ」を開いて、2 つの Animaion Clip

  • SeatPosition_Backward2Forward
  • SeatPosition_Down2Up

を作成してください
image.png

Animation State Machine の概形を作る

先ほど編集した Animator Controller を選択して Animator タブを開き、
Animation Layer「AvatarChair_SeatPosition_前後」を作成してください
image.png
こちらの Blending はいつも通り、デフォルトの Override のままにしてください

Animation Layer「AvatarChair_SeatPosition_上下」を作成してください
image.png
今回は Blending を Additive にしてください

こちらを Override にすると、「AvatarChair_SeatPosition_前後」で適用された椅子の前後位置が、より下方にある「AvatarChair_SeatPosition_上下」によって上書きされ、「座る位置」が前後に動かなくなります

Animation Layer の Weight を忘れずに 1 に設定してください!

Animation Clip「SeatPosition_Backward2Forward」を
Animation Layer「AvatarChair_SeatPosition_前後」にドラッグアンドドロップしてください
image.png

Animation Clip「SeatPosition_Down2Up」を
Animation Layer「AvatarChair_SeatPosition_上下」にドラッグアンドドロップしてください
image.png

Animation State の設定

Parameters の + マークを押して Float を選択し、2 つの Float パラメータ

  • Backward2Forward
  • Down2Up

を作ってください
image.png

Float パラメータと Int パラメータは見ただけでは区別がつきません
image.png
(一方が Float、もう一方が Int)

判別するときは、ドット . を入力してください。
Float パラメータは小数の入力ができ、Int パラメータは小数点 . の入力自体ができません
image.png
(Int パラメータ var2 に . を連打するも入力できない様子)

ここからが新しい操作です。

SeatPosition_Backward2Forward を選択して Inspector を見て、
Motion Time のチェックボックスをオン ✅ にしたのち、
左隣のドロップダウンからパラメータ Backward2Forward を選択してください
image.png

同様に、SeatPosition_Down2Left を選択して Inspector を見て、
Motion Time のチェックボックスをオン ✅ にしたのち、
左隣のドロップダウンからパラメータ Down2Up を選択してください
image.png

Expression Parameter の設定

追加した Animation Parameter (以下、AnimParam) と同名のパラメータを、これから ExParam に追加します。
今回はタイピングもコピペも使わない方法をとります。

先ほど作成した ExParam の Inspector にて、「Options > Copy from Animator」を選択して下さい
image.png

開かれたエクスプローラーのウィンドウ内で、先ほど編集した Animator Controller を選択して決定してください
image.png

ダイアログで Yes を選択してください
image.png

自動的に正しいパラメータが追加されます
image.png
一応、Type, Default, Saved, Synced が正しく設定されているか確認してください

Expression Menu の設定

先ほど作成した ExMenu の Inspector にて、Controls の + マークを押して、追加された行の右側のドロップダウンから RadialPuppet を選択してください
image.png

  • Name: 椅子前後
  • Parameter: [None]
  • Rotation: Backward2Forward, Float

に設定してください
image.png

同様に、行を追加して RadialPuppet を選択し

  • Name: 椅子左右
  • Parameter: [None]
  • Rotation: Down2Up, Float

に設定してください
image.png

コンポーネントの設定変更

コンポーネントが追加されている Game Object の Inspector にて、
MA Parameters コンポーネントの アセットからインポート プロパティに、
先ほど編集した ExParam「AvatarChairP」をドラッグアンドドロップしてください
image.png
これによって、新たに 2 つのパラメータ

  • Backward2Forward
  • Down2Up

が IsBoxCollider の下に追加されます

Animation Clip の録画

まず、Animator コンポーネントが追加されている Game Object を選択して、
Animation ウィンドウのドロップダウンから SeatPosition_Backward2Forward を選択してください
image.png

録画ボタンを押して、子オブジェクト「座る位置」を選択し、Inspector にて Transform の Position の Z 座標に -1 を入力してください
image.png

キーフレームの Position.y の値が 0 であることに注意してください。
0 以外の値を設定すると、その値の分だけ「座る位置」の上下にずれます

Animation ウィンドウを拡大して 1 フレーム目を表示して、
1 フレーム目に再生ヘッドを移動させたのち、
同じ子オブジェクトの Transform の Position の Z 座標に 1 を入力してください
image.png

録画ボタンと Preview ボタンを押して、録画を安全に終了してください

同様に、Animation ウィンドウのドロップダウンから SeatPostion_Down2Up を選択して
image.png
録画ボタンを押して、

0 フレーム目に、子オブジェクトの Transform の y 座標に 0 を入力し
image.png

既に Transform の Position の Y の値が 0 である状態で新たに 0 を入力しても、プロパティ Position.Y の値が 0 であるキーフレームは録画できません。

一度任意の数字を入力して決定した後、再度 0 を入力することで、値を 0 に設定するキーフレームを作れます

1 フレーム目に、子オブジェクトの Transform の y 座標に 1 を入力してください
image.png

こちらは Position.z が 0 であることに注意してください

録画ボタンと Preview ボタンを押して、安全に録画を終了してください。

以上で「座る位置をゲーム内で動かす」ギミックの実装は終了です。お疲れさまでした。

複数レイヤーで実装するこの方式では、
アバター Sit 判定を操作するために 3 つの Animation Layer

  • AvatarChair_BoxCollider
  • AvatarChair_SeatPosition_前後
  • AvatarChair_SeatPosition_上下

を作成する必要があります。

また、衣装着脱 Toggle やシェイプキー操作 RadialPuppet などを作る度に Animation Layer が増えるため、管理が煩雑になります。

次に紹介する単一レイヤーで実装する方式なら、これらを 1 つの Animation Layer にまとめられます。
またその方式の方が、コミュニティの調査において高い FPS を記録することが報告されており1、パフォーマンスが高くなる (軽いアバターになる) ことが知られています

座る位置をゲーム内で動かす (単一レイヤー)

(これまでと被る部分は説明を省略しています)

Animator Controller の設定

新しい Animator Controller「AvatarChair_BlendTree」を作ってください
image.png

AvatarChair_BlendTree を選択して Animator タブを開き、
Animation Layer「AvatarChair」を作ってください
image.png
、、、Weight を 1 にするの忘れてないよね?

右側 (方眼) の何もないところを右クリックして、「Create State > From New Blend Tree」をクリックしてください
image.png

Animation State 名を「AvatarChair (WD On)」とし、Inspector の Write Defaults が オン ✅ になっていることを必ず確認してください
image.png

今回の実装環境であれば、本当は Animation State 名の末尾に (WD On) を付ける必要はありません。
Avatar3.0Manager の使用を想定した VRCShool による解説において、(WD On) を付けることを推奨しているため2345、今回の解説ではこれに準拠して命名しました。

ただし Avatar3.0Manager を使わない場合であっても、(WD On) と明記することで Write Defaults の設定漏れが防ぎやすくなるため、末尾に (WD On) と書くことをお勧めします

作成した Animiation State をダブルクリックして、BlendTree の編集画面に移ってください
image.png

Inspector で BlendType から Direct を選んでください
image.png

Motion 右下の + マークを押して「New Blend Tree」を選択して
image.png

BlendTree を 3 つ追加してください
image.png

Parameters で 4 つの Float パラメータ

  • Constant_One
  • IsBoxCollider
  • SeatPosition_Backward2Forward
  • SeatPosition_Down2Up

を作成してください
image.png

今回は IsBoxCollider も Float パラメータであることに注意してください!
BlendTree では Float パラメータのみ使うことができます。

他の Int, Bool, Trigger でパラメータを作ると、この後の BlendTree に適用するパラメータを選択する段階において、ドロップダウンに表示されなくなります

これまでの章のアバター Sit 判定と今回のアバター Sit 判定を同じアバターに両方入れる場合、今回のパラメータ IsBoxCollider を IsBoxCollider_BlendTree と命名して区別してください。

2 つのギミックのパラメータ名が同一であると、1 回のトグル操作で同じ位置にある 2 つの Sit 判定が有効化され、どちらのギミックを操作しているか分かりづらくなり、動作チェックがしづらくなるからです

実装例ではすべての prefab を同じアバターに入れても問題なく動作するので、そちらも参考にしてください

このとき Constant_One に 1 を入力することをお勧めします。

ここで 0 と入力しても、ExParam で Default:1 に設定すれば問題なく動作します。
しかし、ここで画像のように「Constant_One 1」とすることで

  • Copy from Animator でパラメータを追加したときに、自動で Default:1 に設定してくれる
  • Animator Controller の Parameters において、「Constant_One 0」という一見矛盾した状態を回避できる
  • Constant_One が「定数の 1 であり、いついかなるときも値が変化しない」という明示ができ、BlendTree に適用した後などにロジックを追いやすくなるため、メンテナンスが楽になる

というメリットが得られます

親 BlnedTree を選択して、Parameter のドロップダウンから Constant_One を選択してください
image.png
Normalized Blend Values は必ず オフ ▢ にしてください。

画面上方の子 BlendTree を選択し、お好きな名前を設定して、
Parameter のドロップダウンから IsBoxCollider を選択してください
image.png

Motion 右下の + マークを押して「Add Motion Field」で 2 つの Motion Field を追加して
image.png

それぞれに先ほど作成した

  • BoxCollider_Off
  • BoxCollider_On

をドラッグアンドドロップしてください
image.png

「Animation Clip をまとめて管理するフォルダ」に 4 つの Animation Clip

  • SeatPosition_Backward
  • SeatPosition_Forward
  • SeatPosition_Down
  • SeatPosition_Up

を作成してください
image.png

先ほど同様、画面中央にある子 BlendTree を選択し、お好きな名前を設定して、
Parameter に SeatPosition_Backward2Forward を設定してください。
「Add Motion Field」で 2 つの Motion Field を追加し、いま作成した

  • SeatPosition_Backward
  • SeatPosition_Forward

をドラッグアンドドロップしてください
image.png

同じように、画面下方にある子 BlendTree を選択し、お好きな名前を設定して、
Parameter に SeatPosition_Down2Up を設定してください。
「Add Motion Field」で 2 つの Motion Field を追加し、いま作成した

  • SeatPosition_Down
  • SeatPosition_Up

をドラッグアンドドロップしてください
image.png

ファイルの作成と編集

Project タブにて、2 つのファイル

  • ExParam: AvatarChair_BlendTreeP
  • ExMenu: AvatarChair_BlendTreeM

を作成してください
image.png

ExParam「AvatarChair_BlendTreeP」の Inspector にて、
以下のデフォルトで生成される 3 つのパラメータを削除し
image.png

Animator Controller の Parameters と同名のパラメータを追加してください
image.png
その際、先頭に追加される Blend パラメータを削除し、

Name Type Default Saved Synced
Constant_One Float 1 オフ ▢ オフ ▢
IsBoxCollider Bool オフ ▢ オン ✅ オン ✅

としてください

AnimParam の IsBoxCollider は Float 型に設定しましたが、
ExParam の IsBoxCollider は Bool 型に設定してください

AnimParam と ExParam の型を「不一致」にさせる理由は次の記事で解説しています。
今回の場面を例にしているので、合わせてご覧ください

ただし、高度な内容を含み、これを知らなくても上記の操作を行えば問題なく実装できるので、初学段階であれば飛ばすことをお勧めします。

ExMenu「AvatarChair_BlendTreeM」の Inspector にて、
Parameter に ExParam「AvatarChair_BlendTreeP」をドラッグアンドドロップして、
複数レイヤーのときと同じように設定してください
image.png

ExParam「IsBoxCollider」で Bool 型を設定したので、画像の通り「IsBoxCollider, Bool」と表示されます

コンポーネントの設定変更

まず、コンポーネントが追加された Game Object の Inspector にて、MA Parameters の - マークを使って、複数レイヤーのときに追加したパラメータをすべて削除してください
image.png

次に、MA Parameters の アセットからインポートする プロパティに対して、
先ほど作った ExParam をドラッグアンドドロップしてください
image.png

また、MA Menu Installer の インストールされるメニュー に、先ほど編集した ExMenu をドラッグアンドドロップしてください
image.png

Animation Clip の録画

コンポーネントがアタッチされている親オブジェクトの Inspector にて、2 つのプロパティ

  • Animator コンポーネントの Controller プロパティ
  • MA Merge Animator コンポーネントの 統合されるアニメーター プロパティ

に対して、先ほど編集した Animator Controller「AvatarChair_BlendTree」をドラッグアンドドロップしてください
image.png

同じ Game Object が選択されている状態で、Animation ウィンドウにてドロップダウンから「SeatPosition_Backward」を選択してください
image.png

録画ボタンを押し、0 フレーム目と 1 フレーム目に子オブジェクト「座る位置」の Transform の Position Z を -1 に設定するキーフレームを作成してください
image.png
同様に残りの Animation Clip も録画します。

「SeatPosition_Forward」を選択して、Position Z を 1 に設定するキーフレームを作成し
image.png

「SeatPosition_Down」を選択して、Position Y を 0 に設定するキーフレームを作成し
image.png

「SeatPosition_Up」を選択して、Position Y を 1 に設定するキーフレームを作成してください
image.png

以上で「座る位置をゲーム内で動かす」ギミックの単一レイヤーでの実装は終了です。お疲れさまでした。

終わりに

今回はアバター Sit 判定関連のギミック実装を通して、Animation の入門をしました

入門と言いつつ単一レイヤー方式の実装で「DBT を使ったレイヤー圧縮」という高度なトピックにも触れました

ギミックの実装は 3 回しかしていませんが、入門記事となれるように丁寧に説明していたら、おぞましいほどの文章量になってしまいました、、、

そのうち、アバターギミックを網羅的に解説した全 5 編程度のシリーズ記事を書こうと思っています。
そのときは何万字書くのか、執筆に何十時間かかるのか、今から恐怖しつつ、今回の記事を終えようと思います

  1. Jellejurre. "Unity/VRChat Performance Benchmarks". VRCShool. 2025. https://vrc.school/docs/Other/Benchmarks/#direct-blend-trees, (2026-11-04). ↩

  2. Jellejurre, JustSleightly, hfcred. "Combining Layers Using Direct Blend Trees". VRCShool. 2025. https://vrc.school/docs/Other/DBT-Combining/#af9b08d723fb47698407a8c0dde577dc, (2026-11-04) ↩

  3. Jellejurre, JustSleightly. "Advanced Blend Tree Techniques". VRCSchool. 2025. https://vrc.school/docs/Other/Advanced-BlendTrees/#0736f78b3ffe4e28ad156809d48eff21, (2026-11-04) ↩

  4. Jellejurre, JustSleightly. "Animated Animator Parameters (AAP)". VRCShool. 2024. https://vrc.school/docs/Other/AAPs/#9730068c176e46029b8142d99210456f, (2026-11-04). ↩

  5. Jellejurre, JustSleightly. "Designing Scale-Friendly Systems". VRCShool. 2024. https://vrc.school/docs/Other/Scale-Friendly/#12ffd925c0fd4776b0116e01ead50121, (2026-11-04). ↩

来源:Qiita · Unity 开发社区 · qiita.com