Joint (ジョイント)
掴んで移動させたときに回転を制御(制限)するコンポーネント
項目
- Enabled:
- このコンポーネントを有効にするかどうか。
- EditModeOnly:
- 編集モードの時だけ掴めるようにする。
- AllowSteal:
- 他のユーザーが奪い取れるようにする。(DontDriveがTrueの時に機能する。)
- DropOnDisable:
- 掴んでいる間にEnabledをFalseにしても、それを離すまでは掴んでいられるようにする。
即座に切り離したい場合はFalseにする。
- DontDrive:
- 自スロットのRotationを駆動しない。
初期設定(False)の時、掴むとRotationが駆動されます。Trueの時は書込みっぽい。ホストがAFK(不在)だったり、一部のヘッドレスセッションでは、挙動がおかしくなるかも。
とりあえずTrueにして、様々な環境やユーザーでテストしてみましょう。
さらに、Rotationを他からも制御している場合は難解です。(ローカルで動いちゃってる可能性もあるので、様々な検証が必要です。)
- AllowOnlyPhysicalGrab:
- レーザー操作(リモートグラブ)で掴めないようにする。
これをTrueにするとデスクトップモードの人が不憫です。
- ActiveUserFilter:
- 物がユーザーの中にあるとき、掴めるかどうかを指定する。
(Jointを掴んでも手の中(Holder)に入らないので、Grabbableとは挙動が異なります。)
0 Disabled 無効 1 OnlyActiveUser ユーザーの中にあるとき、そのユーザーだけ掴める。ユーザーの中にないとき、誰も掴めない。 2 ActiveUserWhenPresent ユーザーの中にあるとき、そのユーザーだけ掴める。ユーザーの中にないとき、誰でも掴める。 3 ExcludeActiveUser ユーザーの中にあるとき、そのユーザーだけ掴めない。ユーザーの中にないとき、誰でも掴める。
- 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:
- 掴んで動かした時のコントローラー振動設定。
0 None 無 1 Short 弱 2 Medium 中 3 Long 強
- 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を中間の階層にアタッチします。 - 掴んでコンテキストメニュー操作「破棄」「複製」「保存」等ができます。
阻止する場合は、DestroyBlockやDuplicateBlockやGrabbableSaveBlockを自スロット又は上の階層にアタッチします。
DestroyRootをアイテムのRootにアタッチする事で、Jointを破棄した際にアイテム毎破棄する事が可能です。
ObjectRootによって「保存」等の挙動が変化します。 - SmoothValue(WriteBack)を組み合わせれば、回転を滑らかにできます。
- GrabbableAvatarPoseFilterを組み合わせれば、アバターの手の動きを乗っ取る事ができます。
- 似たコンポーネントにSliderがあります。
- KnobControlと組み合わせると、回転量をfloatに変換できます。
- このコンポーネントは素直に動いてくれないので厄介です。
しかし、一工夫するだけで素直な挙動になります。その技を以下に記します。(Twistに効果的です。)
- 普通に開き戸やハンドル等を作ります。(Axis=Y軸で解説します。)
- JointがあるスロットのY座標を約1~2mずらす。(通常は+方向へオフセットする。)
- 子スロット(MeshRendererやCollider等が入っている。)を逆方向にずらして、元の見た目に戻す。
以上です。
このように、Jointのみを回転軸上空に配置するだけで、劇的に挙動が改善します。