PhysBones
PhysBonesは、アバターやワールド内のオブジェクトに二次的な動き(揺れもの)を追加できるコンポーネント群です。髪、尻尾、耳、衣服、ケーブル、植物などに動きを加えることができます。これらを適切に使用することで、アバターはよりダイナミックでリアルになり、ワールドはより没入感のあるものになります。
アバターでのPhysBonesの使用例は、Avatars SDKに含まれています。これを確認するには、Unityウィンドウ上部のメニューバーから VRChat SDK\Samples に進み、プラットフォームに適したサンプルアバターを選択してください。
VRCPhysBone
VRCPhysBoneは、PhysBonesを使用してアニメーション化するボーンの連鎖を定義します。これらは、髪、尻尾、垂れ耳などのソフトボディや二次的な動きをシミュレートするために使用できます!多くの設定オプションがあり、多様な方法でセットアップ可能です。
さらに、PhysBonesは自分や他のユーザーがインタラクションできます!PhysBonesをつかんで動かしたり、PhysBonesをつかんでいる間にトリガーを引くことで、その位置で固定する「ポーズ」をとらせたりすることができます。設定を変更して、ポージングを禁止したり、つかむことを禁止したり、衝突判定を完全に無効にしたりすることも可能です。アバターに設定されたPhysBonesは、インタラクション設定が許可されていれば、他のユーザーがつかんだりポーズをとらせたりすることもできます!
本来の用途ではありませんが、VRChat独自の布(Cloth)コンポーネントを実装するまでの間、PhysBonesは布の代用としても十分に機能します。
![]()
Versions
使用するVRCPhysBoneコンポーネントのバージョンは、コンポーネント上で直接選択できます。新しいコンポーネントを作成する際は、デフォルトで最新バージョンが選択されます。既存のPhysBonesは、手動で更新して再アップロードしない限り、以前のバージョンがそのまま使用されます。
Version 1.0:
- VRCPhysBoneコンポーネントの基本バージョンです。
Version 1.1:
- Squishy Bones(ボーンの伸縮)アップデート。ボーンが押しつぶされたり、動きによって長さが変化したりするようになります。
- Gravityが、静止時にボーンがどれだけ回転するかの比率として機能するようになりました。ボーンを重力の方向に移動させるには、正のPull値が必要です。
- Stiffnessが、ボーンを以前の向きに維持するための比率として機能するようになりました。
Transforms
Root Transform - このコンポーネントが開始されるトランスフォームです。空欄の場合、このゲームオブジェクトから開始されると見なされます。
Ignore Transforms - このコンポーネントの影響を受けないようにするトランスフォームのリストです。ここで指定したトランスフォームの子要素も自動的に除外対象となります。
Ignore Other Phys Bones - 有効にすると、PhysBoneはシーン階層において自分より下位にある他のPhysBonesやその影響を受けるトランスフォームを無視します。このオプションはデフォルトで有効になっており、無効にすると予期しない挙動を引き起こす可能性があります。
Endpoint Position - チェーンの各終端に追加のボーンを作成するために使用されるベクトルです。ゼロ以外の値が設定されている場合のみ使用されます。通常は、ボーンの「上」方向を指す+Y軸に沿って値を大きくすることをお勧めします。
Multi-Child Type - 複数のボーンチェーンが存在する場合のルートボーンの挙動です。3つのモードがあります。
Ignoreに設定した場合、ルートボーンは動かず、物理演算も無視されます。ルートに1つのPhysBoneコンポーネントを配置するだけで、すべての髪の毛のボーンに影響を与えることができるため、アバターの髪の毛などに便利です!
Firstに設定した場合、ルートボーンは階層内の最初のボーンチェーンと連続した1つのチェーンを形成します。他のすべてのチェーンも機能しますが、最初のチェーンのようにルートからではなく、それぞれのチェーンの最初のボーンから開始されます。
Averageに設定した場合、ルートボーンの動きは他のすべてのチェーンの平均になります。つまり、各チェーンの基部が動くようになります。
単一のルートボーン、または複数の子を持つ(しかし孫を持たない)単一のルートボーンを使用している場合は、必ずEndpoint Positionを定義してください!
例えば、以下のRootBoneにPhysBoneコンポーネントを配置する場合、PhysBonesを機能させるためにEndpoint Positionを定義する必要があります。これはDynamic Bonesとは異なる点です!
Single Bone
RootBone
Multiple Children, Single Root
RootBoneChildBone1ChildBone2ChildBone3ChildBone4
各ChildBoneの後に「エンドボーン」を追加することでも対処できますが、それにはアーマチュアの編集が必要です。
Forces
Integration Typeは、このコンポーネントの影響を受けるトランスフォームの動きをシミュレートするために使用される計算方法を定義します。選択内容に応じて、Forcesセクションで利用可能なオプションが変化します。以下の2つから選択できます。
Simplifiedは、より安定した方法です。外部からの衝撃や力に対する反応はやや遅く鈍く感じられますが、設定は容易です。Advancedは安定性に欠けますが、より複雑な設定が可能で、外部からの衝撃や力に対してより敏感に反応する傾向があります。
デフォルト設定では、これら2つのモードはかなり似た挙動をしますが、設定を調整して試してみると、それぞれの違いがすぐに分かるはずです。
以下のオプションのほとんど(すべてではないにしても)は、スライダーの横にあるCボタンを押すことでカーブ(Curves)を使用できます。カーブを使用すると、ボーンチェーンの長さに沿って値を調整できるため、ボーンチェーン内で非常に複雑なセットアップが可能になります!
実は、ほとんどの PhysBones 設定でカーブ(Curves)を使用できます!その使い方を学べば、PhysBones の見た目が驚くほど良くなります!
Pull - ボーンを休止位置に戻すために使用される力の強さです。
Spring - ボーンが休止位置に戻ろうとする際に揺れる量です。Simplified Integration Type でのみ使用可能です。
Momentum - ボーンが休止位置に戻ろうとする際に揺れる量です。Advanced Integration Type でのみ使用可能です。説明は同じですが、効果は Spring とはわずかに異なります。
Stiffness - ボーンが休止位置に留まろうとする強さです。Advanced Integration Type でのみ使用可能です。
Gravity - ボーンに適用される重力の強さです。正の値を指定するとボーンは下方に、負の値を指定すると上方に引っ張られます。
Gravity Falloff - Gravity がゼロ以外の値の時のみ使用可能です。休止位置にある間、どれだけ重力を無効化するかを制御します。1.0 に設定すると、休止位置にある間は重力がボーンに全く影響しなくなります。これにより、ボーンの休止状態に影響を与えることなく、初期位置から回転した際に重力の影響を得ることができます。
Gravity Falloff パラメータの使用例として、アバターの髪が直立した状態で理想のポーズになるようモデリングされている場合、Gravity Falloff を 1.0 に設定できます。こうすれば、ただ立っている間は重力の影響を受けず、髪はモデリングされた位置で静止します。もし髪が45度の角度で突き出すようにモデリングされており、きれいな曲線になるよう(完全な真っ直ぐや垂直にならない程度に)重力の影響を与えたい場合は、このスライダーを使って 0.5 〜 0.8 程度に調整することで、休止ポーズにおいて重力を部分的に適用させることができます。
Immobile Type は、Immobile の動作を変更します。
All Motion に設定すると、Immobile はルートトランスフォームの親から計算されるあらゆる動きを軽減します。これは新しい PhysBones や変換された Dynamic Bones のデフォルトモードです。このモードでは、シーン空間またはプレイスペースにおけるすべての PhysBone の動きが Immobile ファクターによって減衰されます。
World (Experimental) に設定すると、Immobile はシーンルートトランスフォームを基準とした位置の動きのみを無効化します。アニメーションや IK を通じた動きは、通常通りボーンに影響を与えます。このモードは将来的に変更される可能性があります!
使用しているアバターの文脈で言うと、これはプレイスペース内を歩き回る動作は通常通り PhysBones に影響を与える一方、移動(ジョイスティックを倒して移動する動作)については、Immobile ファクターによってその動きが減衰されることを意味します。
Limits
Limits を設定すると、PhysBone チェーンが動く範囲を制限できます。これはアバターの髪が頭にめり込むのを防ぐなどの状況で役立ち、コライダーを使用するよりもはるかに高いパフォーマンスを発揮します! さらに、Limits のオプションを設定する際、PhysBone チェーンを選択していると Scene ビューに制限の視覚化が表示されます。これは Limits を微調整する際に非常に便利です!
Limit Type には複数のモードがあります。すべてのモードで、Pitch、Yaw、Roll (それぞれ X、Y、Z 軸に対応)の観点から Rotation を調整可能です。
None
None は、このボーンチェーンに制限が有効になっていないことを意味します。設定オプションはありません。
Angle
Angle は、ボーンチェーンが Rotation によって定義された軸を中心として、ある Max Angle に制限されることを意味します。これは Scene ビューでは円錐として表示されます。
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)に与える影響量です。ゼロに設定すると、ボーンは掴んだり衝突したりした時のみ伸縮するようになります。
Max Stretch - ボーンが伸縮できる最大量です。この値は元のボーンの長さに対する倍率となります。注意: Maximum Bounds
Max Squish - ボーンが収縮できる最大量です。この値は元のボーンの長さに対する倍率となります。
Grab & Pose
Allow Grabbing - プレイヤーがボーンを掴めるようにします。アバターの場合、そのアバターを着用しているユーザーと他のユーザーの間でフィルタリングするオプションがあります。
Allow Posing - プレイヤーがボーンを掴んだ後にポーズを取れるようにします。アバターの場合、そのアバターを着用しているユーザーと他のユーザーの間でフィルタリングするオプションがあります。
Grab Movement - 掴まれたボーンの移動を制御します。値をゼロにすると、PullとSpringを使用して掴んだ位置に到達しようとします。値を1にすると、掴んだ位置へ瞬時に移動します。
Snap To Hand - ボーンが掴まれた際、掴んでいるボーンの位置にスナップします。
Options
Parameter - アバター上のPhysBoneでのみ利用可能なオプションです(ワールド上の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 - シーンビューでこのコンポーネントのGizmoを表示するかどうかを設定します。Gizmoが表示されない場合は、シーンビュー自体のGizmoが有効になっていることを確認してください。
Bone Opacity - ボーン自体を表すGizmoの不透明度を設定します。
Limit Opacity - ボーンに適用された移動制限を表すGizmoの不透明度を設定します。
重要な注意点、使用のヒントなど
ConstraintとPhysBoneのコンポーネントが同じゲームオブジェクトに影響を与えるような設定は避けてください。 実行順序の問題が発生する原因となります。 Constraintは親のゲームオブジェクトに適用してください。Constraintのソーストランスフォームは、元のゲームオブジェクトに設定したままでも問題ありません。
Meta QuestのアバターにおけるPhysBonesには厳格な制限があります。 これは、すでにCPUリソースが不足しがちなMeta Questデバイスでのパフォーマンス低下を防ぐための措置です。 これらの制限については、Minimum Displayed Performance Rank ドキュメントにあるQuestのVery Poor制限を参照してください。 この厳格な制限はワールドには適用されませんが、モバイル対応のワールドを作成する場合は、プレイヤーがワールドから離脱するようなパフォーマンス低下を避けるため、PhysBonesの使用数を制限することを検討してください。
コンポーネントごとの制限
1つのPhysBoneコンポーネントが一度に影響を与えられるトランスフォームの数は最大256個までです。 これにはルートボーンおよびすべての子ボーンが含まれます。これはアバター上のDynamic Boneの変換にも影響します!
しかし、そもそもこれほど多くのトランスフォームをアニメーションさせるべきではありません。チェーン内のボーンを親ボーンに向かって統合するようにしてください。Cat's Blender Pluginなどのコミュニティツールでこれを行うことができます。
PhysBoneプロパティの変更
Spring、Pull、StiffnessなどのPhysBoneプロパティは初期化時に設定されます。 アバターにおいて、これらの値は定数であることを前提としており、アニメーションさせることはできません。ただし、PhysBoneコンポーネントのプロパティをアニメーションさせた後、そのコンポーネントを一度オフにしてから再度オンにすることで、意図した挙動が得られる可能性があります。これらはサポートされているアニメーション方法ではなく、将来的なアップデートでもサポートされません(つまり、壊れる可能性があり、その場合に修正されることはありません)。
ワールドでは、Udonスクリプトを介してPhysBoneのプロパティを変更する選択肢がありますが、頻繁な変更は控えるようにしてください。詳細は PhysBone Udon Access in Worlds を参照してください。
ヒューマノイドボーン
HumanoidのボーンをPhysBoneのルートボーンに設定しないでください。 つまり、Hip、Spine、Chest、Upper Chest、Neck、Head、または手足のボーンをルートに設定してはいけません。これにより重大な問題が発生します。 代わりに、ルートとして使用したいボーンを複製し、アニメーションさせたいすべての子ボーンをその新しい複製ルートの下に再配置してください。これはBlenderで行う必要があります。Cat's Blender Pluginなどのコミュニティツールを使用して行うことも可能です。
PhysBoneの回転
Dynamic Bonesとは異なり、PhysBoneチェーンのルートボーンは回転が許可されています。 ただし、移動(位置の変更)はできません。これは特定のセットアップで影響が出る可能性があるため、実際に試して挙動を確認してください。
PhysBone AV3 パラメータ
AV3アバターのパラメータに影響を与える際、VRCExpressionParameters オブジェクトで定義されるような同期パラメータを使用する必要はありません。これらのパラメータは、ローカルおよびリモートの両マシンでPhysBonesが実行されるため、既に双方で更新されています。
PhysBoneのImmobile(固定)挙動
Dynamic Bonesは、Inert の値をコンポーネントが配置された場所(ルートトランスフォームではなく)から算出します。これはおそらくDynamic Bonesのバグです。そのため、PhysBonesでは Immobile の値をルートトランスフォームから算出するようにしています。これにより、場合によっては挙動に影響が出る可能性があります。
コンポーネントの最適な使用方法
PhysBonesはマルチスレッド処理を行うため、すべてのボーンを1つのチェーンに入れるのが最も効率的とは限りません。複数のコンポーネントに分けることで、スレッド間で処理を分散させることができます。とはいえ、コンポーネントの数は少ない方が望ましいですが、Dynamic Bonesの頃と比べて、アバターやワールドオブジェクトにいくつかコンポーネントを配置してもそれほど大きな問題にはなりません。
どうしても数値が必要な場合は、1つのコンポーネントで128個を超えるトランスフォームに影響を与えるようなチェーンのセットは分割することを検討してください。例えば256個のボーンを持つドレスがあり、それがルートで分割されているなら、2つか3つのコンポーネントに分割すれば機能します。
しかし、32個程度のボーンを扱うだけであれば、気にする必要はありません。お察しの通り、これらは厳格なルールというわけではありません!将来的には、設定方法を改善すべき箇所が見つかった際に、ソフトな警告を表示する機能を導入する予定です。
Maximum Bounds
各 VRCPhysBone コンポーネントには、ボーンの動きに合わせて伸縮するバウンディングボックスがあります。このバウンディングボックスは、プレイヤーが PhysBone に触れたり掴んだりする際の当たり判定を補助するものです。効率化のため、バウンディングボックスは最大10×10×10メートルに制限されています。PhysBone がこの範囲外に出ても期待通りに動作し続けますが、その場所によってはプレイヤーがボーンに触れたり掴んだりできなくなる可能性があります。
バウンディングボックスは、当たり判定を持ち、半径が0より大きいボーンのみを考慮します。非常に長い伸縮を実現したい場合は、伸縮ポイントの先に当たり判定を持つボーンが存在する限り、この最大範囲の制限に抵触することを回避できます。
ワールドにおける PhysBone の Udon アクセス
PhysBone は本来アバター向けに設計されていますが、ワールドでも使用可能です。ワールド内で PhysBone を操作する場合、Animator を使うのではなく、Udon スクリプトを使用してください。ワールドで PhysBone を扱う際の主な違いは以下の通りです。
- 名前空間
VRC.SDK3.Dynamics.PhysBone.Componentsにある型VRCPhysBoneを使用して PhysBone にアクセスします。 - 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 の角度、押し潰し量、伸縮量を読み取ることができます。 - 対応する名前のフィールド(
pull、stretchなど)や、それらのプロパティが使用できるカーブ(pullCurve、stretchCurveなど)を通じて、PhysBone の全プロパティの読み取りと設定が可能です。- これらのプロパティを変更した後は、すべての変更が完了した時点で PhysBone に対して
ApplyConfigurationChanges()を呼び出す必要があります。そうしないと、変更が実際に PhysBone へ適用されません。 - PhysBone の設定変更は負荷がかかる可能性があります! 過度に行うとパフォーマンスの問題を引き起こし、プレイヤーにとってワールドが快適でなくなる可能性があるため、頻繁な変更は避け、変更を適用する前に可能な限りバッチ処理でまとめてください。
- これらのプロパティを変更した後は、すべての変更が完了した時点で PhysBone に対して
- PhysBone で掴みやポーズを許可している場合、以下の Udon メソッドを使用して強制的に操作を終了させることができます。これらはローカルクライアントでのみ動作します。そのため、全員に対して掴みやポーズを解除したい場合は、すべてのクライアントが受信する Network Event からこれらを呼び出す必要があります。
ReleaseGrabs()を呼び出すと、ローカルプレイヤーが現在 PhysBone を掴んでいる場合、強制的に離させることができます。ReleasePoses()を呼び出すと、PhysBone に適用されているすべての固定ポーズが解除され、自然な形状に戻ります。
VRCPhysBoneCollider
適切に設定された PhysBone に影響を与えるコライダーを定義します。
![]()
Root Transform - このコライダーを配置する Transform です。空の場合、このゲームオブジェクトの Transform が使用されます。
Global Collision - 選択したコンテンツタイプ内のすべての PhysBone が、このコライダーを自身の Colliders リストの一部として扱います。衝突を実際に処理するかどうかを決定する際、PhysBone の Allow Collision(衝突を許可)ルールが引き続き適用されます。アバターの場合、Global Collision(グローバル衝突)を有効にできる PhysBone コライダーは最大4つまでという制限があります。ワールドにはグローバルコライダー数の制限はありません。
Shape Type - このコライダーで使用する衝突形状のタイプです。Sphere、Capsule、Plane コライダーから選択できます。Global Collision は Sphere と Capsule コライダーでのみサポートされています。
Radius - 原点から拡張するコライダーのサイズです。
Height - 各端の半球を含めた、Y 軸に沿ったカプセルの高さです。Shape Type が Capsule に設定されている場合のみ使用されます。
Position - ルート Transform からの配置オフセットです。
Rotation - ルート Transform からの回転オフセットです。
Inside Bounds - 有効にすると、このコライダーはボーンを外に出すのではなく、範囲内に保持するようになります。
Bones As Sphere - 有効にすると、このコライダーは PhysBone の衝突半径を、ボーンの長さに沿ったカプセルとしてではなく、ボーンの位置を中心とした球体として扱います。
Standard Colliders
アバターには、Avatar Descriptor の「Colliders」セクションに一連の「Standard Colliders」が定義されています。このセクションでは、すべてのアバターに存在する標準的なコライダーを定義できます。これらは何も変更しなければ自動的にセットアップされますが、アバターに合わせて正確に調整することも可能です。これらのコライダーはパフォーマンス評価には影響しません。
- Head
- Torso
- Hands L/R
- Feet L/R
- Fingers L/R
- Index
- Middle
- Ring
- Little
これらのコライダーは、主に Contact Sender として機能し、他の人が自分のアバターで検出できる 組み込みの身体部位タグ を使用します。ただし、指と手のコライダーは、他の人の PhysBone やワールド内の PhysBone に影響を与えるために使用できるグローバル PhysBone コライダーを作成するためにも使用されます。
ワールドにおける Collider の Udon アクセス
PhysBones と同様に、ワールドで作業する際には Udon を使用して PhysBone コライダーの主なプロパティにアクセスおよび変更することが可能です。ワールド内のコライダーを変更する場合は、Animator を使用するのではなく、Udon スクリプトを使用してください。
- 名前空間
VRC.SDK3.Dynamics.PhysBone.Componentsにある型VRCPhysBoneColliderを使用して、PhysBone コライダーにアクセスします。 - PhysBone コライダーの以下のプロパティは、読み取りおよび設定が可能です:
shapeType、radius、height、position、およびrotation。- これらのプロパティを変更した後は、すべての変更が完了した後に必ず PhysBone コライダーの
ApplyConfigurationChanges()を呼び出してください。そうしないと、変更内容がコライダーに反映されません。 - PhysBone コライダーの設定変更は負荷が高くなる可能性があります! 過度に行うとパフォーマンス上の問題が発生し、プレイヤーにとってワールドが快適でなくなる可能性があります。これらのプロパティを頻繁に変更することは避け、適用する前に可能な限り多くの変更をまとめてバッチ処理するようにしてください。
- これらのプロパティを変更した後は、すべての変更が完了した後に必ず PhysBone コライダーの
VRCPhysBoneRoot
このコンポーネントを使用すると、1つ以上のPhysBoneコンポーネントの移動ルートを定義し、移動時に固定時間(fixed time)とリアルタイム(real time)のどちらで更新するかを設定できます。このコンポーネントは任意であり、ワールドでのみ使用可能です。
![]()
Timing - このコンポーネントがアタッチされているGameObjectの子である、すべての VRCPhysBone チェーンで使用されるタイミングモードを設定します。
以下の3つのタイミングオプションから選択できます。
Automatic(デフォルト): 子の PhysBone は、固定時間とリアルタイムのどちらで移動するかを自動的に判断します。トランスフォームの動きに応じて2つの間を動的に切り替え、視覚的なジッター(揺れ)を最小限に抑えます。Fixed Time: 子の PhysBone は固定時間で更新されます。つまり、UnityのFixedUpdate()コールバックに対応する固定タイムステップを使用します。Real Time: 子の PhysBone はリアルタイムで更新されます。つまり、UnityのUpdate()コールバックに対応する可変タイムステップを使用します。
移動ルートが手動で定義されていない場合、PhysBone は使用すべき更新タイミングを自動的に判断しようとします。
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へ完全に移行しているものと想定されています。
Dynamic Boneの手動変換
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 の値は、PhysBonesに相当する機能がないため無視されます。
Dynamic Boneの非推奨化
アバターのコンテキストにおいて、Dynamic BoneはVRChatから完全に削除されました。つまり、Dynamic Boneを使用し続けているすべてのアバターは、現在自動生成されたPhysBonesを使用することになります。
Dynamic Boneは現在ワールド内ではまだ使用可能ですが、将来的にアバターと同様の方法で、ワールド読み込み時に自動的にPhysBonesへ変換する形で非推奨となる可能性があります。
最終更新: