State Behaviors
このドキュメントは、Unity Animatorsに関する基本的な知識があることを前提に記述されています。
Animatorビューで特定のステートを選択すると、State Behaviorsを追加できるようになります。これらはステートに対するコンポーネントのようなもので、さまざまな機能を実行します。実際にいくつか追加して、何ができるか試してみてください!
すべてのState Behaviorは、そのステートへ遷移する最初のフレームで実行されます。
State Behaviorは、そのステートがステートマシン内に留まる時間の長さに関係なく実行される はず です。
ここで「はず」という言葉をあえて使用しているのは、Unity documentationにおいて、遷移時間やステートの持続時間が極端に短い場合にState Behaviorが必ず実行されるという保証が定義されていないためです。
完全に安全を期すのであれば、State Behaviorが含まれるステートと、そのステートへの直接的な遷移にかかる合計時間を最低でも0.02秒確保してください。もっとも、実際にはそこまで必要になるケースはほとんどありません。
Animator Layer Control
![]()
Animator Layer Control を使用すると、指定した Playable Layer 内の特定の Animator Layer のウェイトを、任意の時間をかけてブレンドできます。
ブレンドの途中でステートから抜けた場合、ターゲットとなるレイヤーのウェイトは即座に目標値へ設定されます。
設定されたレイヤーのウェイトは、他のステートでこの State Behavior が再度実行され、リセットされるまで維持されます。
| Property Name | Purpose |
|---|---|
| Playable | 操作対象とする Playable Layer を選択します。 |
| Layer | 操作したい Playable Layer のインデックスを指定します。0番目(ベース)のレイヤーは常にウェイトが 1.0 に設定されているため、変更することはできません。 |
| Goal Weight | ブレンド後の目標ウェイトを指定します。 |
| Blend Duration | ブレンドにかかる時間(秒)を指定します。0 を指定すると即座に変更されます。 |
| Debug String | この StateBehavior が実行された際、出力ログにこの文字列が表示されます。デバッグに便利です。 |
Animator Locomotion Control
![]()
Animator Locomotion Control は、Animator の特定のステートにおいて移動(Locomotion)を無効化できる機能です。ここで設定された移動状態は、別のステートでこの State Behavior が再び実行され、状態が変更されるまで維持されます。
デスクトップモードでは、この設定により並進移動が無効化され、回転(視点)操作が垂直軸のみに制限されます。VR モードでは、コントローラーによる並進移動と回転移動が無効化され、半身 IK が制限されます(全身 IK には影響しません)。いずれのモードでも、プレイヤーのカプセルは固定されます。
| パラメーター | 説明 |
|---|---|
| Disable Locomotion | True に設定すると、移動(操作による移動)が無効になります。ルームスケールの移動は引き続き可能です。False に設定すると、移動が有効になります。 |
| Debug String | この State Behavior が実行されると、指定した文字列が出力ログに表示されます。デバッグに便利です。 |
Animator Temporary Pose Space
![]()
Animator Temporary Pose Spaceを使用すると、アバター着用者の視点を、Animatorステートのその時点における頭部の位置へ移動させることができます。
この視点は、別のステートでこのState Behaviorが再度実行され、リセットまたはクリアされるまで維持されます。
この動作は、Delay Timeが経過した時点で実行されます。
Animator Temporary Pose Spaceは、座ったり地面に横たわったりするような姿勢の変化によって視点の高さを更新する必要がある場合にのみ使用してください。アバターを「スケール(拡大・縮小)」する目的で使用することはできません。そのような方法で使用すると、重大な不具合が発生する原因となります。
このState Behaviorが設定されているステートが、Delay Timeが経過する前に終了または中断された場合、この動作は実行されません!
| Property Name | 目的 |
|---|---|
| Pose Space | 有効化(Enter)または無効化(Exit)を選択します。Enterはポーズスペースを設定し、Exitはデフォルトの状態にクリアします。 |
| Fixed Delay | 遅延時間を固定の時間で指定するか、ステートの持続時間に対する割合で指定するかを選択します。 |
| Delay Time | 値を指定すると、その遅延後に視点が設定されます。アニメーションに時間をかけてブレンドする場合などに便利です。 |
| Debug String | このStateBehaviorが実行された際、指定した文字列が出力ログに表示されます。デバッグに役立ちます。 |
Animator Tracking Control
![]()
Animator Tracking Control を使用すると、アバターの身体のさまざまな部位における IK やシミュレーションによる動きを有効または無効にできます。「No Change」に設定すると、その部位の現在の状態は変更されません。「Tracking」に設定すると、IK やシミュレーションによる動きに追従するようになります。「Animation」に設定すると、その部位はアバターの Animator から与えられた値を強制的に反映するようになります。
すべての IK トラッキングポイントを Animation に設定すると、アニメーションは Networked IK を介して変換されるのではなく、Animation としてリモート環境で再生されます。各種トラッキングタイプにおけるこれらの「IK トラッキングポイント」は以下の通りです。
- Desktop: Head、Left Hand、Right Hand
- 3pt Tracking: Head、Left Hand、Right Hand
- 6pt / FBT Tracking: Head、Left Hand、Right Hand、Hip、Left Foot、Right Foot
Eyes と Eyelid を除き、すべての部位は IK によって駆動されます。Eyes と Eyelid はシミュレーションによって駆動されます。Mouth および Jaw は Viseme(口形)によって駆動されます。
例として、Left Hand と Right Hand を Animation に設定すると、IK によって定義された手(および腕)の位置は無視され、代わりに現在アクティブなステートのモーションを使用して手と腕の位置が定義されます。これらを再度 Tracking に設定すると、IK が使用されるようになります。
Eyes & Eyelid を Animation に設定すると、目の動きとまばたきが無効になります。Eyes & Eyelid を Tracking に設定すると、シミュレーションによる目の動きとまばたきが再び有効になります。
Mouth および Jaw を Animation に設定すると、Viseme(口形)が無効になり、Viseme(口形)パラメータの更新が停止します。Mouth および Jaw を Tracking に設定すると、Viseme(口形)が再度有効になり、更新が再開されます。
Tracking の設定は、他のステートでこの State Behavior が再度実行され、リセットされるまで維持されます。
| パラメータ | 説明 |
|---|---|
| Tracking Control | 上記の説明を参照してください。 |
| Debug String | この State Behavior が実行されると、この文字列が出力ログに表示されます。デバッグに役立ちます。 |
Avatar Parameter Driver
![]()
Avatar Parameter Driverは、Animator Parametersをさまざまな方法で操作できます。1つのAvatar Parameter Driverで複数の操作を実行可能で、操作は上から順に処理されます。これらの操作は、当該Behaviorが設定されているStateに移行した瞬間に一度だけ完了します。
Local Only を使用すると、isLocal を検知する代わりのショートカットとして、ドライバーがローカルでのみ動作するようになります。
「Add」をクリックすると、ドライバーに新しい操作が追加されます。最初のタイプ(デフォルトで選択されています)は「Set」です。
同期パラメータ(VRCExpressionParametersオブジェクトで定義されたもの)を修正する場合、その値は最大範囲にクランプ(制限)されます。Intは [0, 255]、Floatは [-1, 1] となります。
ただし、Animation Controller内でのみ定義されているパラメータ(いわゆる「ローカルパラメータ」)であれば、パラメータドライバーで修正可能です。これらの値はクランプされません。
また、VRChatで定義されたAnimator Parameters をドライバーで操作することはできません。
Set、Add、Random、およびCopyは、float および int で動作します。Set、Random、およびCopyは、bool で動作します。
Set
Setは、単にDestinationで指定したパラメータにValueを設定します。
![]()
Add
Addは、Destinationで指定したパラメータにValueを加算します。
コンポーネントに記載されている通り、Addを使用すると、アバターのリモートインスタンスで実行した際に同じ結果が得られない場合があります。Addを使用する場合は、同期されたDestination Parameterを使用し、ドライバーをローカルでのみ実行することをお勧めします。
![]()
Random
Randomは、Destination ParameterにMin ValueからMax Valueの間の乱数を設定します。
コンポーネントに記載されている通り、Randomを使用すると、アバターのリモートインスタンスで実行した際に同じ結果が得られない場合があります。Randomを使用する場合は、同期されたDestination Parameterを使用し、ドライバーをローカルでのみ実行することをお勧めします。
Booleanパラメータを使用する場合、Chance変数を使ってパラメータがtrueになる確率を設定できます。
Intパラメータを使用する場合、Prevent Repeats設定を使って同じ値が連続して選ばれるのを防ぐことができます。
![]()
Copy
Copyは、Source Parameterの値をDestination Parameterに設定します。これは、あるfloatを別のfloatに合わせたり、floatの範囲を再マッピングしたり、異なる2つの型の間で値を変換したりする際に使用できます。
GestureLeftWeight などのVRChat組み込みパラメータは、指定は可能ですが、ソースパラメータとして機能しません。
![]()
型変換
bool から変換する場合、Falseは0、Trueは1として扱われます。
bool に変換する場合、0はFalse、それ以外はすべてTrueとして扱われます。
int に変換する場合、値は常に最も近い整数へと切り捨てられます。
float に変換する場合、他のプレイヤーへの同期が可能な範囲外であっても、値をそのままコピーします。
カスタム範囲
Convert Range チェックボックスを使用すると、カスタム変換範囲を設定できる追加UIを有効にできます。これは、値の再マッピングや、型変換の仕方をより細かく制御したい場合に使用します。
![]()
Playable Layer Control
![]()
Playable Layer Control を使用すると、Playable Layer 全体のウェイトを、指定した時間にかけて指定した値までブレンドできます。Animator Layer Control と非常によく似ていますが、こちらは Playable Layer 全体を制御します。
Action Playable レイヤーはデフォルトでウェイトが 0 になっており、アニメーション終了後には常にウェイトを 0 に戻す必要があるため、この State Behavior が頻繁に使用されます。
ブレンドの実行中にステートから抜けた場合、Playable Layer は即座に目標ウェイトに設定されます。
| Property Name | Purpose |
|---|---|
| Layer | 影響を与える Playable Layer。 |
| Goal Weight | ブレンド完了後に目標とする Playable Layer のウェイト。 |
| Blend Duration | レイヤーをブレンドするまでにかかる時間。0 は即時適用となります。 |
| Debug String | この StateBehavior が実行されると、この文字列が出力ログに表示されます。デバッグに役立ちます。 |
Animator Play Audio
![]()
「Animator Play Audio」ビヘイビアは、アニメーションステートに遷移する際、AudioSourceの設定を変更します。オーディオクリップ、ピッチ、またはループ値を変更したり、AudioSourceの再生を開始したりできます。
AudioSourceの相対パス(Armature/Hips/Spine/)を「Source Path」プロパティに入力する必要があります。このプロパティは、オーディオソースコンポーネントを選択することで自動的に入力可能です。オーディオソースがアバターのルートにある場合、「Source Path」は空欄にしてください。
「Playback Order」プロパティは、すべてのプレイヤーで同じ順序でオーディオクリップが再生されることを保証するものではありません。 たとえば、「Random」設定では、プレイヤーごとに異なるクリップが選択される可能性があります。すべてのプレイヤーに同じクリップを確実に聞かせたい場合は、複数のアニメーションステートを使用するか、同期されたAnimatorパラメータと組み合わせて「Playback Order」を「Parameter」に変更してください。
「Animator Play Audio」はサブステートマシン内のステートに追加できます。ただし、サブステートマシン自体に追加することは推奨されません。ステートビヘイビアがサブステートマシン内のすべてのステート遷移に適用され、他のステートビヘイビアと意図しない干渉を引き起こす可能性があるためです。
| プロパティ名 | 用途 |
|---|---|
| Source Path | アバターのルートトランスフォームから見たAudioSourceへのパス。 このステートに最初に遷移したときにAudioSourceが見つからない場合、AnimatorPlayAudioは無効化されます。 |
| Playback Order | このステートに遷移した際に、どのオーディオクリップを選択するかを決定します。 • Random: ランダムなクリップを選択します。(デフォルト) • Unique Random: ランダムなオーディオクリップを選択しますが、同じクリップを2回連続で選択することはありません。 • Roundabout: 最初のクリップ、次に2番目のクリップと順番に選択します。最後のクリップの後は、再び最初のクリップが選択されます。 • Parameter: "int" 型のアバターパラメータに基づいてクリップを選択します。たとえば、パラメータが0の場合、最初のクリップが選択されます。パラメータはアバターのExpressions Parametersで定義されている必要があります。パラメータが見つからない場合は、代わりに最初のクリップが選択されます。 |
| Clips | このステートに遷移した際、AudioSourceに適用できるAudioClipのリスト。 |
| Random Volume | このステートに遷移した際、AudioSourceに適用されるランダムボリューム。0から1の間で制限されます。 • Min: 最小ランダムボリューム。(デフォルト: 1) • Max: 最大ランダムボリューム。(デフォルト: 1) |
| Random Pitch | このステートに遷移した際、AudioSourceに適用されるランダムピッチ。-3から3の間で制限されます。 • Min: 最小ランダムピッチ。(デフォルト: 1) • Max: 最大ランダムピッチ。(デフォルト: 1) |
| Loop | このステートに遷移した際、AudioSourceのループ設定を有効にするか無効にするか。 |
| On Enter | このステートに遷移する際に、AudioSourceを開始または停止するかどうか。 🗹 Stop Audio Source(デフォルト: 有効) 🗹 Play Audio Source(デフォルト: 有効) |
| On Exit | このステートから遷移する際に、AudioSourceを開始または停止するかどうか。 ☐ Stop Audio Source(デフォルト: 無効) ☐ Play Audio Source(デフォルト: 無効) |
| Play On Enter Delay In Seconds | 有効な場合、「Play On Enter」がクリップを再生するまでの遅延時間。0から60秒の間で制限されます。(デフォルト: 0秒) |
各オーディオ設定には追加のプロパティがあります。デフォルトでは「Apply If Stopped」に設定されています。これにより、オーディオソースが前のクリップの再生を終了しておらず、「Stop Audio Source On Enter」が無効な場合に、設定が適用されるのを防ぎます。
| 設定名 | On Enter |
|---|---|
| Always Apply | オーディオソースが現在クリップを再生中であっても、設定が適用されます。 |
| Apply If Stopped | クリップを再生中でない限り、オーディオソースに設定が適用されます。(デフォルト) |
| Never Apply | 設定は使用されず、インスペクター上でグレーアウトされます。 |
最終更新: