😺

[Unity]XR Interaction ToolkitからOculus Integrationのコントローラーモデルを動かす

2021/12/18に公開

XR Interaction Toolkitを使用している環境で、Oculus Integrationに入っているOculus Touchのコントローラ―のモデルを動かすメモです。

前提条件

  • Windows 10
  • Unity 2021.2.1f1
  • XR Interaction Toolkit 2.0.0-pre.5
  • XR Plugin Management 4.0.7
  • Oculus Integration 35.0

XR Plugin Management、XR Interaction Toolkit、Oculus Integrationをインストールして、諸々設定&シーンにXR Originを配置した状態とします。

コントローラ―のモデルを追加する

Oculus > VR > Meshesの中に、デバイスごとのモデルを格納しているフォルダがあります。

それぞれのフォルダには、デバイスごとのモデルと、AnimationController、Materialが格納されています。
今回はOculusTouchForQuestAndRiftSフォルダの下にある、OculusTouchForQuestAndRiftS_LeftとOculusTouchForQuestAndRiftS_Rightを、XR Originの中にあるLeftHand ControllerとRightHand Controllerの下にそれぞれ配置しました。

また、コントローラのAnimatorに、対応するAnimation Controllerを格納します。
Animation Controllerは、モデルが格納されているフォルダにあるAnimationフォルダの下に入っています。

Animatorの中は下の画像のようになっていて、Button 1、Button 2等のパラメータを設定すると、コントローラーのモデルの対応するボタンが動作します。

InputActionを作成する

コントローラーの入力を取得してAnimatorを動作させるため、それぞれのボタンと対応するInput Actionを作成します。
プロジェクトウインドウを右クリックして、Create > Input ActionsでInput Actionを作成します。名前は仮にOculus Controller Actionsとしておきます。
作成したInput Actionを開いて、入力の設定を行っていきます。

まず、左右のコントローラ―用のAction Mapを追加しています。ここでは名前をOculus Left ControllerとOculus Right Controllerにしています。
Oculus Left Controllerについて、それぞれのボタンと対応するActionとBindingを追加します。

Actions Action Type Control Type Binding
Primary Button Button なし XR Controller > XR Controller(Left Hand) > Optional Controls > primaryButton [LeftHand XR Controller]
Secondary Button Button なし XR Controller > XR Controller(Left Hand) > Optional Controls > secondaryButton [LeftHand XR Controller]
Menu Button Button なし XR Controller > XR Controller(Left Hand) > Optional Controls > menuBotton [LeftHand XR Controller]
Trigger Value Axis XR Controller > XR Controller(Left Hand) > Optional Controls > trigger [LeftHand XR Controller]
Grip Value Axis XR Controller > XR Controller(Left Hand) > Optional Controls > grip [LeftHand XR Controller]
Thumbstick Value Vector2 XR Controller > XR Controller(Left Hand) > Optional Controls > thumbstick [LeftHand XR Controller]

右のコントローラーも同様に設定します。右のコントローラーを設定する際は、XR Controller(Left Hand)をXR Controller(Right Hand)にする必要があります。

以下のようなInput Actionが作成されます。

InputActionの入力を受け取って、アニメーションを更新する

LeftHand Controller、Right HandControllerにそれぞれ、以下のようなスクリプトを追加します。

using UnityEngine;
using UnityEngine.InputSystem;

public class OculusControllerAnimation : MonoBehaviour
{
	[SerializeField]
	private InputActionReference primaryButtonAction;
	
	[SerializeField]
	private InputActionReference secondaryButtonAction;
	
	[SerializeField]
	private InputActionReference menuButtonAction;
	
	[SerializeField]
	private InputActionReference thumbstickAction;
	
	[SerializeField]
	private InputActionReference triggerAction;
	
	[SerializeField]
	private InputActionReference gripAction;
	
	[SerializeField]
	private Animator m_animator;

	private void Awake()
	{
		if (m_animator == null)
		{
			m_animator = GetComponent<Animator>();
		}
	}

	private void Update()
	{
		// Animatorが存在しない場合は終了
		if (m_animator == null) return;

		// モデルのボタン等を更新
		m_animator.SetFloat("Button 1", primaryButtonAction.action.ReadValue<float>());
		m_animator.SetFloat("Button 2", secondaryButtonAction.action.ReadValue<float>());
		m_animator.SetFloat("Button 3", menuButtonAction.action.ReadValue<float>());
		m_animator.SetFloat("Joy X", thumbstickAction.action.ReadValue<Vector2>().x);
		m_animator.SetFloat("Joy Y", thumbstickAction.action.ReadValue<Vector2>().y);
		m_animator.SetFloat("Trigger", triggerAction.action.ReadValue<float>());
		m_animator.SetFloat("Grip", gripAction.action.ReadValue<float>());
	}
}

それぞれのスクリプトに、先ほど作成したOculus Controller Actionsから、対応するInput Action Referenceを格納します。
また、AnimatorにはOculusTouchForQuestAndRiftS_XXXのAnimatorを格納します。

コントローラが動作するようになります。

その他

Rayの開始位置がコントローラーと被るので、LeftHand Controller、RightHand Controllerに付いているXR Ray InteractorコンポーネントのRay Origin Transformを設定してRayの開始位置をZ軸方向に少しずらすとコントローラーと被らなくなります。

Discussion