JavaScriptを有効にしてください

AnyStateを使用したAnimatorControllerの整理術

 ·  ☕ 1 分で読めます  ·  ✍️ gatosyocora

はじめに

VRChat Advent Calender 2021の5日目の記事です。 https://adventar.org/calendars/6466

服などを切り替えるギミックを実装していると、魔法陣みたいなことになったことはありませんか。
切り替えるものが増えていくと余計に管理が大変になります。

こんなときにはAnyStateが使えることが多いです。

AnyStateを使うとこんな感じに整理できます。

整理することで

  • 状態の変化がわかりやすくなる
  • 新しい状態が追加されたときに引く矢印の数が少なくて済む

などのメリットがあります。

AnyStateはどんな仕組み

変更前は1の状態はDefault, 2, 3, 4, 5に向けた矢印(赤色)とそれぞれから向けられた矢印(水色)があります。
Default, 2, 3, 4, 5の状態も他の状態に向けた矢印と向けられた矢印があります。

それに対して、変更後は1の状態はAnyStateから向けられた矢印(水色)のみです。
Default, 2, 3, 4, 5の状態もAnyStateから向けられた矢印のみです。

これはAnyStateが「どの状態ともみなせるもの」なのでこのような構成で表現できます。

AnyStateを1以外の状態とみなしたときに、これらの状態が1に向けた矢印を向けているようになります。
つまり今回の例では、Default, 2, 3, 4, 5の状態が1に矢印を向けています。

また、AnyStateを1の状態とみなしたときは、他の状態に矢印を向けているようになります。
つまり今回の例では、1がDefault, 2, 3, 4, 5の状態に矢印を向けています。

これで変更前のようにすべての状態に向けた矢印とそれらから向けられた矢印を表現できます。

注意点

AnyStateを使う時は自分自身にも矢印が向いていることに注意する必要があります。
この状態だとAnyStateと1を常に切り替えるような挙動になり、他のユーザーに負荷をかけることがあります。

これを回避するためにはAnyStateから伸ばしたそれぞれの矢印のCan Transition To Selfのチェックを外しておきます。
これで自身の状態から同じ状態に切り替わることがなくなります。

矢印に設定する切り替える条件

服などの物を出し入れする場合は、矢印に設定する条件は基本的には「切り替えるパラメータがそれぞれ特定の数値と等しくなったとき」で良いです。

下の例の場合は、Costumeが切り替えるパラメータでEquals(等しい)で0, 1, 2, …と比較しています。
これによってExpressionMenu1でConstumeの値を1, 2, …と切り替えたときに服などの表示するオブジェクトが切り替わるようにできます。

服などの物を出し入れするギミックについては以下で解説しているので、こちらをご覧ください。
[VRChat] Avatars3.0で物を出し入れする (EmoteSwitchみたいなもの)

おわりに

今回はAnimatorControllerをAnyStateを使って整理する方法を紹介しました。
AnimatorControllerでは他にもSubStateMachineBlendTreeなどの機能を使えばさらに整理することもできるので、こちらにも挑戦してみてください。

参考


  1. VRChat内で使用できる円形のメニュー ↩︎

共有

gatosyocora
著者
gatosyocora
Software Engineer