Transform/Interaction/Joint

Last-modified: 2025-09-18 (木) 17:12:33


Joint (ジョイント)

掴んで移動させたときに回転を制御(制限)するコンポーネント


項目

Enabled:
このコンポーネントを有効にするかどうか。

EditModeOnly:
編集モードの時だけ掴めるようにする。

AllowSteal:
他のユーザーが奪い取れるようにする。(DontDriveがTrueの時に機能する。)

DropOnDisable:
掴んでいる間にEnabledをFalseにしても、それを離すまでは掴んでいられるようにする。
即座に切り離したい場合はFalseにする。

DontDrive:
自スロットのRotationを駆動しない。
初期設定(False)の時、掴むとRotationが駆動されます。Trueの時は書込みっぽい。

ホストがAFK(不在)だったり、一部のヘッドレスセッションでは、挙動がおかしくなるかも。
とりあえずTrueにして、様々な環境やユーザーでテストしてみましょう。
さらに、Rotationを他からも制御している場合は難解です。(ローカルで動いちゃってる可能性もあるので、様々な検証が必要です。)


AllowOnlyPhysicalGrab:
レーザー操作(リモートグラブ)で掴めないようにする。
これをTrueにするとデスクトップモードの人が不憫です。

ActiveUserFilter:
物がユーザーの中にあるとき、掴めるかどうかを指定する。
(Jointを掴んでも手の中(Holder)に入らないので、Grabbableとは挙動が異なります。)
0Disabled無効
1OnlyActiveUserユーザーの中にあるとき、そのユーザーだけ掴める。ユーザーの中にないとき、誰も掴めない。
2ActiveUserWhenPresentユーザーの中にあるとき、そのユーザーだけ掴める。ユーザーの中にないとき、誰でも掴める。
3ExcludeActiveUserユーザーの中にあるとき、そのユーザーだけ掴めない。ユーザーの中にないとき、誰でも掴める。

CustomCanGrabCheck:
???

_grabber:
自動。
手の掴むヤツ。

(掴んだユーザーのグラバーが自動的に設定される。上級者向けですが、Flux等で設定する事も可能です。)

_holdSlot:
自動。
手の掴むヤツのスロット。(放しても残るので、最後に掴んだ人が分かる。)

_pos:
自動。
無。

_rot:
自動。
自スロットのRotationを駆動。

_scl:
自動。
無。

__legacyActiveUserRootOnly:
???

GrabPriority:
掴む優先度。
複数の物を同時に掴んだ際、数字が大きい方が優先される。同じ数字だと一緒に掴める。

MaxSwing:
特定の軸で振り動かす最大量。(0~180)
コントローラーのスティックのような挙動です。

例えば90だと±90°ではなく、±180°です。


MaxTwist:
特定の軸で捻る最大量。(0~180)
開き戸のような挙動です。

Axis:
回転軸を指定する。

0で無視、1で指定。


TwistReferenceAxis:
捻り軸。

とりあえず、Axisと異なる軸を1にしておくと良い感じ。


PositionTwistThresholdAngle:
???(説明が難しい。自分で試してネ。)

VibrationAngle:
振動角度。
0だと掴んでいる間、ずっと振動し続ける。
1だと1°回転する度に1回振動する。

VibrationPreset:
掴んで動かした時のコントローラー振動設定。
0None
1Short
2Medium
3Long

SnapIncrement:
スナップ値。
0だと無段階。
1だと1度単位でスナップ回転する。

SnapTime:
スナップアニメーションの時間。
SnapOnReleaseがTrueの時に働く。
1だと1秒かけて回転する。

SnapOnRelease:
放した時にスナップさせる。
初期設定(False)だと、Snap角度に瞬間移動する。
Trueだと、無段階に回転できる。放した時にアニメーション(Tween)が働く。


SnapOrientations(list):
Add押すと増える。
スナップさせる角度と範囲を設定できる。

Orientation:
スナップさせる角度。

MaxAngle:
スナップさせる角度。(この範囲内に近づくと、スナップする。)
範囲が被っている場合の挙動は謎でした。(確実に動作させるなら、被せない方が良さそう。)


origRotation:
自動。
???

rotReference:
自動。
???

dirReference:
自動。
???

twistReference:
自動。
???

usePositionTwist:
自動。
???


使用例

  • 掴めるようにするにはColliderも必要。
    他のグラブ系コンポーネントは消しておきましょう。
  • 開き戸(90°開閉)を例に、MaxTwistの解説をします。
    MaxTwistが45なら、原点角度から-45~45°の範囲で回転するという事です。
    その為、開き戸の原点角度は半開き状態(45°オフセット)の角度にすることで、綺麗に開閉できるようになります。
    親又は子スロットを作り、その角度オフセットするのが簡単です。
    さらに、VibrationやSnap設定を行う事でインタラクションが充実します。


その他

  • Jointを掴んでも手の中(Holderスロット)に入らないので、Grabbableとは挙動が異なります。
    グラブモード「手のひら」等だと、複数人又は両手で掴むと階層を遡って掴みます。(片手で掴むと左右だけ、両手で掴むと左右上下に回転するギミックが作れます。)
    上階層を掴んでほしくない時はGrabBlockを中間の階層にアタッチします。
  • 掴んでコンテキストメニュー操作「破棄」「複製」「保存」等ができます。
    阻止する場合は、DestroyBlockDuplicateBlockGrabbableSaveBlockを自スロット又は上の階層にアタッチします。
    DestroyRootをアイテムのRootにアタッチする事で、Jointを破棄した際にアイテム毎破棄する事が可能です。
    ObjectRootによって「保存」等の挙動が変化します。
  • SmoothValue(WriteBack)を組み合わせれば、回転を滑らかにできます。
  • GrabbableAvatarPoseFilterを組み合わせれば、アバターの手の動きを乗っ取る事ができます。
  • 似たコンポーネントにSliderがあります。
  • KnobControlと組み合わせると、回転量をfloatに変換できます。

  • このコンポーネントは素直に動いてくれないので厄介です。
    しかし、一工夫するだけで素直な挙動になります。その技を以下に記します。(Twistに効果的です。)
  1. 普通に開き戸やハンドル等を作ります。(Axis=Y軸で解説します。)
  2. JointがあるスロットのY座標を約1~2mずらす。(通常は+方向へオフセットする。)
  3. 子スロット(MeshRendererCollider等が入っている。)を逆方向にずらして、元の見た目に戻す。
    以上です。
    このように、Jointのみを回転軸上空に配置するだけで、劇的に挙動が改善します。