PhysBones
PhysBonesは、アバターやワールドのオブジェクトに二次的な動きを追加できるコンポーネントのセットです。髪の毛、尻尾、耳、衣服、ワイヤー、植物などに動きを加えることができます。これらを適切に使用することで、アバターはよりダイナミックでリアルになり、ワールドはより没入感のあるものになります。
アバターでのPhysBonesの使用例は、Avatars SDKに含まれています。確認するには、Unityウィンドウ上部のメニューバーから VRChat SDK\Samples に移動し、プラットフォームに適したサンプルアバターを選択してください。
VRCPhysBone
PhysBonesでアニメーションさせるボーンチェーンを定義します。髪の毛、尻尾、垂れ耳などのソフトボディや二次的な動きをシミュレートするために使用できます。多数の設定オプションがあり、さまざまな方法でセットアップ可能です。
さらに、PhysBonesはあなたや他のプレイヤーがインタラクションを行うことも可能です!PhysBonesを掴んで動かしたり、掴んでいる間にトリガーを引くことで「ポーズ(Pose)」を取り、その位置で固定したりできます。これらの設定は無効化することもでき、ポーズ不可、掴むこと自体を不可、あるいは衝突判定を完全に無効化するように構成可能です。自分のアバターに設定されたPhysBonesについては、インタラクション設定が許可されていれば、他のプレイヤーがあなたのPhysBonesを掴んだりポーズさせたりすることもできます!
本来の用途とは異なりますが、VRChat独自のClothコンポーネントを実装するまでの間、PhysBonesは布の代用として十分に機能します。

バージョン
VRCPhysBoneコンポーネントのバージョンは、コンポーネント上で直接選択できます。新規にコンポーネントを作成する際はデフォルトで最新バージョンが選択されます。既存のPhysBonesは、手動で更新して再アップロードしない限り、以前のバージョンが引き続き使用されます。
バージョン 1.0:
- VRCPhysBoneコンポーネントのベースバージョンです。
バージョン 1.1:
- 「Squishy Bones」アップデート。ボーンが押し潰されたり、動きによって長さが変化したりする挙動が可能になりました。
- 重力は現在、静止時にボーンがどれだけ回転するかを示す比率として機能します。ボーンが重力の方向に動くためには、正のPull値が必要です。
- Stiffnessは現在、ボーンを以前の向きに維持するための比率として機能します。
Transforms
Root Transform - このコンポーネントの開始位置となるトランスフォームです。空欄の場合、このゲームオブジェクトを開始位置と見なします。
Ignore Transforms - このコンポーネントの影響を受けないトランスフォームのリストです。無視されたトランスフォームの子要素は、自動的にすべて無視の対象となります。
Ignore Other Phys Bones - 有効にすると、このPhysBoneはシーン階層において自身の配下にある他のPhysBoneや、それらが影響を与えるトランスフォームを無視します。このオプションはデフォルトで有効になっており、無効化するとサポートされていない挙動を引き起こす可能性があります。
Endpoint Position - チェーンの各終端にボーンを追加するために使用されるベクトルです。値がゼロでない場合のみ使用されます。通常は、ボーンの「上」方向を指す+Y軸方向に値を増やすのが一般的です。
Multi-Child Type - 複数のボーンチェーンが存在する場合のルートボーンの挙動です。これには3つのモードがあります:
Ignore に設定すると、ルートボーンは動かず、物理演算も無視されます。アバターの髪など、ルートに1つのPhysBoneコンポーネントを適用してすべての髪ボーンに影響を与えたい場合に便利です!
First に設定すると、ルートボーンは階層内の最初のボーンチェーンと連続した一つのチェーンを形成します。他のすべてのチェーンも機能しますが、最初のチェーンのようにルートからではなく、それぞれのチェーンの最初のボーンから開始されます。
Average に設定すると、ルートボーンの動きは他のすべてのチェーンの平均になります。つまり、各チェーンの基部が動くようになります。
単一のルートボーン、あるいは複数の子ボーンを持つ単一のルートボーン(ただし孫ボーンがない場合)を使用する場合、必ずエンドポイント位置(Endpoint Position)を定義してください!
例えば、以下の RootBone のいずれかにPhysBoneコンポーネントを配置する場合、PhysBonesを機能させるために Endpoint Position を定義する必要があります。これはDynamic Boneとは異なる仕様です!
単一ボーン
RootBone
複数の子ボーンを持つ単一のルート
RootBoneChildBone1ChildBone2ChildBone3ChildBone4
各 ChildBone の後ろに「エンドボーン」を追加することでも対処できますが、それにはアーマチュアの編集が必要になります。
Forces
Integration Type は、このコンポーネントの影響を受けるトランスフォームの動きをシミュレートするために使用される計算手法を定義します。選択内容に応じて、Forcesセクションで利用可能なオプションが変化します。以下の2つから選択可能です:
Simplifiedは、より安定した手法です。動きがやや遅く、外部からの衝撃や力に対する反応は鈍くなりますが、設定は容易です。Advancedは安定性は劣りますが、より複雑な設定が可能で、外部からの衝撃や力に対してより敏感に反応する傾向があります。
デフォルト設定では両モードの挙動はかなり似ていますが、設定を調整してテストすれば、すぐにその違いがわかるでしょう。
以下のオプションのほとんど(すべてではないとしても)では、スライダーの横にあるCボタンを押すことでカーブを使用できます。カーブを使用すると、ボーンチェーンの長さに沿って値を調整できるため、ボーンチェーン内で非常に複雑な設定が可能になります!
実は、ほとんどのPhysBones設定でCurvesを使用できます!その使い方を学べば、PhysBonesは見違えるほど素晴らしい見た目になります!

Pull - ボーンが静止位置に戻ろうとする力の強さです。
Spring - ボーンが静止位置に戻る際に揺れる度合いです。Simplified Integration Typeでのみ利用可能です。
Momentum - ボーンが静止位置に戻る際に揺れる度合いです。Advanced Integration Typeでのみ利用可能です。説明は同じですが、Springとはわずかに効果が異なります。
Stiffness - ボーンが静止位置に留まろうとする度合いです。Advanced Integration Typeでのみ利用可能です。
Gravity - ボーンにかかる重力の強さです。正の値はボーンを下に引き、負の値は上に引き上げます。
Gravity Falloff - Gravityが0以外の場合にのみ利用可能です。ボーンが静止位置にあるときに重力がどれだけ無効化されるかを制御します。値を1.0にすると、静止位置にあるボーンには重力が一切作用しなくなります。これにより、ボーンが初期位置から回転して動いたときには重力を作用させつつ、静止状態には影響を与えないように設定できます。
Gravity Falloffパラメーターの使用方法の一つとして、アバターの髪が通常立ち状態のポーズでモデリングされている場合、Gravity Falloffを1.0に設定する方法があります。こうすれば、ただ立っているときに重力が影響せず、髪はモデリングされた位置に留まります。もし髪が(まっすぐな状態から)45度の角度でモデリングされており、重力の影響を受けて自然な曲線を描かせたい(完全に水平でも完全に垂直でもない状態にしたい)場合は、スライダーを0.5〜0.8程度に調整することで、レストポーズにおいて重力の影響を部分的に適用することができます。
Immobile Typeは、Immobileの動作を変更します。
All Motionに設定すると、Immobileはルートトランスフォームの親から計算されるすべての動きを抑制します。これは新規作成されたPhysBonesや、Dynamic Boneの手動変換によって作成されたPhysBonesのデフォルトモードです。このモードでは、シーン空間またはプレイスペースにおけるすべてのPhysBoneの動きが、Immobileの係数によって減衰されます。
World (Experimental) に設定した場合、Immobile はシーンのルートトランスフォームを基準とした位置移動のみを無効化します。アニメーションやIKによる動きは、通常通りボーンに影響を与えます。このモードは将来的に変更される可能性があります!
使用中のアバターにおいて、これはプレイエリア内を移動してもPhysBoneの動きには通常通り影響することを意味しますが、ロコモーション(ジョイスティック入力による移動)を行うと、その移動は Immobile の係数によって抑制されます。
Limits
Limitsを設定することで、PhysBoneチェーンが動く範囲を制限できます。これはアバターに使用する際、髪が頭にめり込むのを防ぐといった状況で有用であり、コライダーを使用するよりも遥かに高いパフォーマンスを発揮します!
さらに、Limitsのオプションを設定する際、PhysBoneチェーンを選択しているとシーンビューにその制限範囲の可視化が表示されます。これらはLimitsを微調整する際に非常に役立ちます!
Limit Type にはいくつかのモードがあります。いずれのモードも、 Pitch 、 Yaw 、 Roll (それぞれX、Y、Z軸に相当)の観点から Rotation を調整することができます。
None
None は、このボーンチェーンに制限が有効化されていないことを意味します。設定項目はありません。
Angle

Angle は、ボーンチェーンが Rotation で定義された軸を中心とした Max Angle に制限されることを意味します。これはSceneビュー上で円錐状(Cone)として可視化されます。
Hinge

Hinge(ヒンジ)は、ボーンチェーンが Rotation で定義された平面に沿って、Max Angle まで制限されることを意味します。これは、ピザやパイのように円の一部を切り取った形状として視覚化されます。
Polar(極座標)

Polar(極座標)は少し複雑です。Hinge を Yaw に沿ってある程度回転させると、Polar 座標における球体の一部分が得られます。Max Pitch と Max Yaw を設定してそのセグメントの大きさを調整し、Rotation を使用してそのセグメントが球体上のどこに位置するかを定義できます。Polar の視覚化機能は特に役立ちます。
Polar limitsはパフォーマンスコストがかかるため、使いすぎないでください。大量(目安として64個以上)に使用すると、何らかの問題が発生する可能性があります。Max Pitch と Max Yaw の値が同じか近い場合は、 Angle リミットを使用した方がパフォーマンス面で有利であり、十分な効果が得られます。
Collision
Radius - 各ボーンの周囲のコリジョン半径(メートル単位)。コリジョンと掴み判定の両方に使用されます。
Allow Collision - このコンポーネントで指定されたもの以外のコライダーとの衝突を許可します。
Colliders - これらのボーンと具体的に衝突するコライダーのリストです。
Allow Collision には3つのオプションがあります:
True に設定すると、このPhysBoneはグローバルコライダーと衝突します。これには、アバターで定義された各プレイヤーの手や、ワールド内のすべてのグローバルコライダーが含まれます。
False に設定すると、このPhysBoneは Colliders リストに記載されたコライダーとのみ衝突します。
Otherに設定すると、対象がアバターかワールドかによって衝突の挙動を制御するオプションが増えます。アバター上のPhysBoneの場合、このアバター上のコライダーや、他のアバターやワールド上のコライダーに対してフィルタリングを行うことができます。ワールド内のPhysBoneの場合、そのワールド、アバター、アイテム上のコライダー、あるいはそれらの組み合わせに反応するかどうかを設定できます。
Stretch & Squish
Stretch Motion - 動きがボーンの伸縮(Stretch/Squish)に与える影響量です。0に設定すると、ボーンは掴まれたり衝突したりした時のみ伸縮するようになります。
Max Stretch - ボーンが伸びることのできる最大量です。この値は元のボーンの長さに対する倍率となります。注:Maximum Bounds
Max Squish - ボーンが縮むことのできる最大量です。この値は元のボーンの長さに対する倍率となります。
Grab & Pose
Allow Grabbing - プレイヤーがボーンを掴めるようにします。アバターの場合、掴めるユーザーを装着者自身と他のユーザーの間でフィルタリングするオプションがあります。
Allow Posing - プレイヤーが掴んだ後にボーンのポーズを付けられるようにします。アバターの場合、この許可を装着者自身と他のユーザーの間でフィルタリングするオプションがあります。
Grab Movement - 掴んだボーンがどのように移動するかを制御します。値を0にすると、プル(引き寄せ)とスプリング(バネ)を使用して掴んだ位置に到達します。値を1にすると、掴んだ位置へ瞬時に移動します。
Snap To Hand - 有効にすると、ボーンを掴んだ際に、そのボーンが掴んでいる手にスナップ(固定)されます。
オプション
Parameter - アバター上のPhysBoneでのみ利用可能なオプションです(ワールド内のPhysBoneからこのデータを取得する方法については、Udon Access in Worldsを参照してください)。これは、アバターコントローラーに複数のパラメーターを提供するための接頭辞として使用されます。例えば以下の項目において、Parameterを Tail に設定すると、 {parameter} は Tail に置き換わります。
Parameter に値を設定すると、アバターのAnimatorに以下のパラメーターが設定されます:
{parameter}_IsGrabbed[Bool] - ボーンが現在掴まれているかどうか{parameter}_IsPosed[Bool] - ボーンが掴まれた後にポーズされているかどうか{parameter}_Angle[Float] - 0.0〜1.0の範囲。エンドボーンが元のレストポジションからどれだけ回転したかを180度の範囲で正規化した値です。言い換えれば、ボーンを開始時の方向から完全に反対側までねじった場合、このパラメーターの値は1.0になります。{parameter}_Stretch[Float] - 0.0〜1.0の範囲。ボーンが最大伸長(ストレッチ)長にどれだけ近いかを表します。{parameter}_Squish[Float] - 0.0〜1.0の範囲。ボーンが最大圧縮長にどれだけ近いかを示します。
Is Animated - ボーンのトランスフォームのアニメーションを許可します。アニメーションの内容に従って、毎フレームボーンのレストポジション(初期位置)が更新されます。PhysBoneチェーン内のいずれかのボーン(ルートボーンを含む!)に対してアニメーションを適用する場合、この設定を有効にする必要があります。
Reset When Disabled - このコンポーネントが無効になった際、ボーンは自動的にデフォルトの位置へリセットされます。
Gizmos
これらの設定は、UnityエディタのシーンビューにおいてPhysBoneがどのように表示されるかを制御します。PhysBoneの挙動には影響しません。
Show Gizmos - シーンビューにこのコンポーネントのギズモを表示するかどうかを設定します。表示されない場合は、シーンビュー自体のギズモ設定が有効になっていることを確認してください。
Bone Opacity - ボーン自体を表すギズモの不透明度を設定します。
Limit Opacity - ボーンに適用される移動制限を表すギズモの不透明度を設定します。
重要な注意点、ヒントなど
同じゲームオブジェクトに対してConstraintコンポーネントとPhysBoneコンポーネントを同時に適用しないでください。実行順序の問題が発生します。
Constraintは親ゲームオブジェクトに適用してください。Constraintのソーストランスフォームには、元のゲームオブジェクトをそのまま設定可能です。
アバターのPhysBoneには、Meta Quest向けに厳格な制限があります。これは、CPUリソースが逼迫しがちなMeta Questデバイスのパフォーマンス低下を防ぐための措置です。
これらの制限については、表示パフォーマンスランクの最小要件のドキュメントに記載されている、Quest向けの「Very Poor」制限を確認してください。
このハードリミットはワールドには適用されませんが、モバイルで利用可能なワールドを作成する場合は、パフォーマンスの問題によってプレイヤーがワールドから離脱してしまう事態を避けるため、PhysBoneの数を制限することを推奨します。
コンポーネントごとの制限
1つのPhysBoneコンポーネントが一度に影響を与えられるトランスフォームの数は最大256個までです。 これにはルートボーンおよびすべての子ボーンが含まれます。これはアバターのDynamic Boneの手動変換にも影響します!
しかし、そもそもアニメーションさせるトランスフォームをこれほど多く配置しないようにすべきです。チェーン内のボーンを親ボーンに統合することをお勧めします。Cat's Blender Pluginのようなコミュニティ製のツールを使用すれば、これを自動で行うことができます。
PhysBoneプロパティの変更
Spring、Pull、StiffnessなどのPhysBoneプロパティは、初期化時に設定されます。
アバターにおいて、これらの値は定数であることを想定しており、アニメーションさせることはできません。ただし、PhysBoneコンポーネントのプロパティをアニメーションさせ、一度コンポーネントをオフにしてから再びオンにすることで、意図した挙動を得られる可能性はあります。ただし、これはサポートされているプロパティのアニメーション方法ではなく、将来的な変更によってサポートされなくなる可能性がある点にご注意ください(言い換えれば、動作しなくなる可能性があり、その場合に修正が行われることはありません)。
ワールドにおいては、Udonスクリプトを介してPhysBoneのプロパティを変更するオプションがありますが、変更頻度は可能な限り抑えるようにしてください。詳細については、Udon Access in Worldsを参照してください。
ヒューマノイドボーン
ヒューマノイドボーンをPhysBoneのルートボーンとして設定しないでください。言い換えれば、Hip(腰)、Spine(脊椎)、Chest(胸)、Upper Chest(上胸)、Neck(首)、Head(頭)、あるいはその他の四肢のボーンをルートとして設定してはいけません。これを行うと重大な問題が発生します。
代わりに、ルートとして使用したいボーンを複製し、アニメーションさせたいすべての子ボーンをその新しい複製ルートの下に再ペアレントしてください。これはBlender内で行う必要があります。Cat's Blender Pluginのようなコミュニティ製のツールがこの作業を代行してくれます。
PhysBoneの回転
Dynamic Boneと異なり、PhysBoneチェーンのルートボーンは回転させることが可能です。ただし、移動(トランスレーション)はできません。これは特定の設定において何らかの影響を及ぼす可能性があるため、実際に試して挙動を確認してください。
PhysBone AV3パラメーター
AV3アバターのパラメーターに影響を与える際、VRCExpressionParametersオブジェクトで定義される同期パラメーター(Synced Parameters)を使用する必要はありません。これらのパラメーターはローカルおよびリモートの両方のマシンで既に更新されており、双方がPhysBoneを実行しているためです。
PhysBoneのImmobile動作
Dynamic BoneではInertの値がルートトランスフォームではなくコンポーネントの配置場所を基準にしていましたが、これはDynamic Boneのバグであると考えられます。そのため、PhysBoneではImmobileの値をルートトランスフォームに基づいて決定します。これにより、一部のケースで動作に影響が出る場合があります。
コンポーネントの最適な使用方法
PhysBoneはマルチスレッドで動作するため、すべてのボーンを単一のチェーンに入れることが常に最も効率的であるとは限りません。複数のコンポーネントを使用することで、処理をスレッド間で分散させることができます。とはいえ、コンポーネントの数はなるべく少なく抑えるべきですが、Dynamic Boneの時ほど厳密に避ける必要はなく、アバターやワールドオブジェクトにいくつか配置しても問題ありません。
本当に数値が必要な場合は、1つのコンポーネントで128個を超えるトランスフォームに影響を与えているなら、チェーンのセットを分割することを検討してください。256個のボーンを持つドレスがあり、ルートで分岐しているような場合、2つまたは3つのコンポーネントに分割すると効果的です。
ただし、32個程度のボーンを扱うだけであれば、気にする必要はありません。お察しの通り、これらは厳密なルールではありません!今後、設定方法を見直すべきと思われる場合には、ソフトな警告を表示するようになる予定です。
Maximum Bounds
各VRCPhysBoneコンポーネントには、ボーンの動きに合わせて拡大・縮小するバウンディングボックスがあります。これらのバウンディングボックスは、プレイヤーがPhysBoneに触れたり掴んだりする際の衝突判定を補助します。効率化のため、バウンディングボックスは最大10×10×10メートルに制限されています。PhysBonesはこの範囲外に出ても期待通りに動作し続けますが、その場所によってはプレイヤーがボーンに触れたり掴んだりできなくなる可能性があります。
バウンディングボックスは、衝突判定を持つボーンと、半径が0より大きいボーンのみを考慮します。非常に長い伸縮を行わせたい場合、伸縮ポイントの先に衝突判定を持つボーンが存在する限り、この最大範囲の制限に達することを回避できます。
ワールドにおけるUdonアクセス
PhysBonesはもともとアバター用に設計されていますが、ワールドで使用することも可能です。ワールド内のPhysBoneを操作する際は、AnimatorではなくUdonスクリプトを使用してください。ワールドでPhysBoneを扱う際の主な違いは以下の通りです。
VRCPhysBone型を使用してPhysBoneにアクセスします。この型はVRC.SDK3.Dynamics.PhysBone.Components名前空間にあります。- PhysBoneが掴まれた、離された、ポーズが設定された、またはポーズが解除されたタイミングを検知するには、PhysBoneコンポーネントと同じゲームオブジェクトにUdonGraphまたはUdonSharpのビヘイビアをアタッチし、以下のイベントを使用します:
OnPhysBoneGrabbed(PhysBoneGrabbedInfo physBoneInfo)- プレイヤーがPhysBoneを掴んだときに呼び出されます。OnPhysBoneReleased(PhysBoneReleasedInfo physBoneInfo)- プレイヤーがPhysBoneを離したときに呼び出されます。OnPhysBonePosed(PhysBonePosedInfo physBoneInfo)- プレイヤーがPhysBoneをポーズに固定したときに呼び出されます。OnPhysBoneUnPosed(PhysBoneUnPosedInfo physBoneInfo)- PhysBoneのポーズが解除されたときに呼び出されます。
IsGrabbedおよびIsPosedプロパティを使用して、PhysBoneが現在掴まれているか、ポーズされているかを確認できます。Angle、Squish、およびStretchプロパティを使用して、PhysBoneの角度、潰れ、伸びの値をいつでも読み取ることができます。- PhysBoneのすべてのプロパティ(
pull、stretchなど)や、それらのプロパティで使用できるカーブ(pullCurve、stretchCurveなど)は、対応する名前のフィールドを介して読み取りおよび設定が可能です。- これらのプロパティを変更する際は、すべての変更を終えた後に必ずPhysBoneの
ApplyConfigurationChanges()を呼び出してください。そうしないと、変更内容が実際にはPhysBoneに反映されません。 - PhysBoneの設定変更は負荷が高くなる可能性があります! 変更しすぎると、ワールドのプレイヤーに不快感を与えるようなパフォーマンスの問題を引き起こす可能性があるため、これらのプロパティを頻繁に変更することは避け、適用前にできるだけ多くの変更をまとめて行うようにしてください。
- これらのプロパティを変更する際は、すべての変更を終えた後に必ずPhysBoneの
- PhysBoneで掴み(Grabbing)やポーズ(Posing)が許可されている場合、以下のUdonメソッドを使用してそれらのインタラクションを強制的に終了させることができます。これらはローカルクライアントでのみ動作します。そのため、全員に対して掴みやポーズを解除したい場合は、すべてのクライアントが受信するNetwork Eventからこれらを呼び出す必要があります。
ReleaseGrabs()を呼び出すと、ローカルプレイヤーが現在PhysBoneを掴んでいる場合、強制的に手を放させることができます。ReleasePoses()を呼び出すと、PhysBoneに適用されている凍結ポーズがすべて解除され、自然な形状に戻るようになります。
VRCPhysBoneCollider
適切に設定されたPhysBoneに影響を与えるコライダーを定義します。

Root Transform - このコライダーが配置されるトランスフォーム。空の場合、このゲームオブジェクトのトランスフォームが使用されます。
Global Collision - 選択されたタイプのコンテンツ内のすべてのPhysBoneは、このコライダーを自身のCollidersリストの一部として扱います。実際に衝突を処理するかどうかを決定する際、そのPhysBoneの「Allow Collision(衝突を許可)」ルールが引き続き適用されます。このプロパティはワールド内のPhysBoneコライダーでのみ使用可能です。
Shape Type - このコライダーで使用する衝突判定形状のタイプ。Sphere(球)、Capsule(カプセル)、Plane(平面)のコライダーから選択できます。
Radius - 原点から広がるコライダーのサイズ。
Height - Y軸に沿ったカプセルの高さ。両端の半球を含みます。Shape TypeがCapsuleに設定されている場合のみ使用されます。
Position - ルートトランスフォームからの位置オフセット。
Rotation - ルートトランスフォームからの回転オフセット。
Inside Bounds - 有効にすると、このコライダーはボーンを外側に押し出すのではなく、境界の内側に保持するようになります。
Bones As Sphere - 有効にすると、このコライダーはPhysBoneの衝突半径を、ボーンの長さに沿ったカプセルではなく、ボーンの位置を中心とした球体として扱います。
Standard Colliders
アバターには、「Colliders」というセクションで定義された一連の「Standard Colliders」がAvatar Descriptor内に存在します。このセクションでは、すべてのアバターに存在する標準的なコライダーを定義できます。設定を変更しなければ自動的にセットアップされますが、アバターに合わせて正確に調整することも可能です。これらのコライダーはパフォーマンスランクには影響しません。
HeadTorso- Hands L/R
- Feet L/R
- Fingers L/R
IndexMiddleRingLittle
これらのコライダーは主にContact Senderとして機能し、他のユーザーのアバターが検知可能な組み込みの身体部位タグを使用します。ただし、指と手のコライダーは、他のユーザーのPhysBoneやワールド内のPhysBoneに影響を与えるグローバルPhysBoneコライダーを作成するためにも使用されます。
VRCPhysBoneRoot
このコンポーネントを使用すると、1つまたは複数のPhysBoneコンポーネントの移動ルートを定義し、それらが移動する際に固定時間(fixed time)で更新するか、リアルタイムで更新するかを設定できます。このコンポーネントはオプションであり、ワールドでのみ利用可能です。
Timing - このコンポーネントがアタッチされているGameObjectの子である、すべてのVRCPhysBoneチェーンが使用するタイミングモードを設定します。
以下の3つのタイミングオプションから選択できます。
Automatic(デフォルト): 子のPhysBonesが、固定時間とリアルタイムのどちらで移動するかを自動的に判断します。トランスフォームの動きに応じて2つを動的に切り替えることで、目に見えるジッターを最小限に抑えます。Fixed Time: 子のPhysBonesが固定時間で更新されます。つまり、UnityのFixedUpdate()コールバックに対応する固定タイムステップを使用します。Real Time: 子のPhysBonesがリアルタイムで更新されます。つまり、UnityのUpdate()コールバックに対応する可変タイムステップを使用します。
移動ルートが手動で定義されていない場合、PhysBonesは使用すべき更新タイミングを自動的に判断しようとします。
Dynamic Boneの手動変換
ワールド内のDynamic Boneコンポーネントは、PhysBonesに自動変換されません。パフォーマンスを向上させ、プレイヤーがPhysBonesを掴んだり操作したりできるようにするため、PhysBonesを使用することを推奨します。
VRChatはアバターのロード時、Dynamic Boneを自動的にPhysBonesへ変換します。これは全体的なパフォーマンスを向上させるためであり、アバター間のインタラクションにおいても必要となります。
デフォルトでは、Dynamic Boneの変換にはAdvancedモードが使用されます。これは、Advanced統合メソッドの方がDynamic Boneの挙動をより正確に再現できるためです。さらに、DB変換ではMulti-Childタイプに対してIgnoreを使用します。これは一部の特殊なDynamic Bone設定で問題を引き起こす可能性がありますが、FirstやAverageを使用すると、変換中にほぼすべてのケースで意図しない挙動が発生してしまいます。
Dynamic BoneとPhysBonesは同一ではないことに注意してください。プログラムによる変換プロセスでは挙動を可能な限り忠実に再現するよう努めますが、完璧ではありません!自動変換の目的は、ほとんどの設定を適切に動作させ、破綻させないことであり、挙動を完璧に複製することではありません。VRChat向けのアバターを作成するすべてのユーザーは、Dynamic BoneではなくPhysBonesを使用するように移行していることが前提となります。
Manual Dynamic Bone Conversion
SDKを使用して、アバターをDynamic BoneからPhysBonesへ変換することを選択できます。
このプロセスはアバターから既存のDynamic Boneコンポーネントを削除するもので、簡単には元に戻せません。そのため、この変換を試みる前に必ずアバターのバックアップを作成してください。
このツールはSDKのBuild Control Panelからアクセスできるほか、Unityメニューの VRChat SDK/Utilities/Convert DynamicBones to PhysBones からも利用可能です。利用する際は、事前にアバターを選択しておく必要があります。
移行されていないDynamic Boneコンポーネント
Dynamic Boneの一部の機能や挙動はPhysBonesに存在せず、移行されません。
Force - Dynamic Boneの Gravity および Force 値におけるX方向またはZ方向の設定は、PhysBonesに相当する機能がないため無視されます。
Dynamic Boneの非推奨化
アバターにおけるDynamic BoneはVRChatから完全に削除されました。つまり、Dynamic Boneを使用していたすべてのアバターは、現在自動的に生成されたPhysBonesに置き換わっています。
Dynamic Boneは現在ワールド内では引き続き使用可能ですが、将来的にはアバターと同様に、ワールド読み込み時に自動的にPhysBonesへ変換することで非推奨化する可能性があります。
最終更新: