1. Prevent ray from picking up GameObjects

現状は XR Ray Interactor で、 XR Grab Interactable を掴んでいるが、これをテレポート用にする

  • Interaction Layer に Raycasts を新たに追加する
  • Project Settings からも確認できる

  • Right/Left Hand Controller 内の Right/Left Ray InteractorInteraction Layer MaskRaycastsのみ にする

  • さらに、現状、「何かを掴んだら、手のモデルを非表示にする」となっているので、Right/Left Ray InteractorXR Ray InteractorSelect イベントを「削除」する

  • テレポートエリアの Teleportation AreaInteraction Layer MaskRaycastsのみ にする

2. Add a near far interactor for each hand

XR Interaction Toolkit の ver3 までは、近距離用の Direct Interactor と遠距離用 Ray Interactor の 2 種類を使い分けて Grab を実装する必要があった。

ここまでのチュートリアルでは Ray InteractorXR Grab InteractableFar Attach Mode のモードの使い分けで、近距離遠距離を使い分けていた。

ver3 からは Near-far Interactor が入り、一つのコンポーネントで DirectRay の両方の Grab の機能を満たせるようになった。

  • Near-Far Interactor を追加すると以下のコンポーネントが付いたオブジェクトが作成される

    • Interaction Attach Controller: GameObjectが掴んだときに手やコントローラーにどのように取り付けられ、オフセットや回転を制御するか
    • Sphere Interaction Caster: Sphere Volume をキャストし、近くのゲームオブジェクトを検出して相互作用する
    • Curve Interaction Caster: 遠距離インタラクション用の曲面光線を投影
  • Near-Far Interactor を追加した後、 Preset の変更を行う。

    • Input System との連携のために必要
    • あまり行わない操作ですが、3ドットメニューの左にあります。
  • 選ぶのは Assets/Settings/NearFarInteractor.preset

    • 左手の場合は Assets/Settings/Left_NearFarInteractor.perset
Preset 変更前変更後
  • 実行時には以下のようになる

  • ここまでの XR Ray Interactor と同じように設定する

    • Interaction Layer MaskHats を追加
      • 当然ここでは Raycasts は入れない
    • Select/Select Exited イベントで手のモデルを消したり表示したりする
  • Near-Far Interactor の子オブジェクトの Line Visual オブジェクト

    • ここは自由に設定してよい
    • Curve Visual ControllerLine Dynamics Mode を調整することで、Interactor に反応する GameObject が無い場合には、 Ray が手元に戻るような表現ができる
  • この時点では、まだ XR Ray Interactor (ここで Teleport Interactor にリネームする) のレイもあるため、どっちのレイなのか分かりにくい。

3. Add haptics and audio to the NearFar Interactor

ここでは、 Ray Interactor に付けていた Haptic Feedback の仕組みを Near-Far Interactor にも付ける。

Right Hand Controller > Near-Far InteractorLeft Hand Controller > Near-Far Interactor
  • Haptic Impulse Player には自動で自身に近い Haptic Impulse Player の GameObject が入る
    • Parent も辿って取得している
public class SimpleHapticFeedback : MonoBehaviour
{
	protected void Awake()
	{
		if (m_PlaySelectEntered || m_PlaySelectExited || m_PlaySelectCanceled ||
			m_PlayHoverEntered || m_PlayHoverExited || m_PlayHoverCanceled)
		{
			if (m_HapticImpulsePlayer == null)
				CreateHapticImpulsePlayer();
		}
	}
	
	void CreateHapticImpulsePlayer()
	{
		m_HapticImpulsePlayer = HapticImpulsePlayer.GetOrCreateInHierarchy(gameObject);
	}

4. Switch Between Teleport Near Far Interactor rays

ここまででは、Ray Interactor と Near-Far Interactor のレイが重なってしまっているので、テレポート用の Ray Interactor のレイは特定のボタンを押した時だけにする。

Left Hand ControllerRight Hand Controller

5. Add an additional binding and repeat for other hand

他のボタンでも使えるようにする

  • primaryButton に追加して thumbstickTouched に binding を追加する。
Left Hand ControllerRight Hand Controller

7. Extension Activities