Edited at

OculusGoのコントローラ入力とキャラクター移動


概要

OculusGoでのキャラクター移動関連についてまとめる。


初期設定


コントローラの入力について

入力の受け取りは下記の通り。

// 押下げた瞬間

OVRInput.GetDown

// 押上げた瞬間
OVRInput.GetUp

// 押している間
OVRInput.Get

キーコードは下記の通り。

// トリガー

OVRInput.Button.PrimaryIndexTrigger

// 戻るボタン
OVRInput.Button.Back

// タッチパッド
OVRInput.Button.PrimaryTouchpad

// タッチパッドに触れている
OVRInput.Touch.PrimaryTouchpad

// タッチされた座標 (Vector2)
OVRInput.Axis2D.PrimaryTouchpad

例えば、トリガーを押した瞬間に何かしたければ下記のようになる。

if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)) {

// 処理
}


移動の仕組みについて

タッチパッドの入力を検知したら、どの部分が押されたかを取得する。

その後、押された部分によって移動方向を確定する。


  1. タッチパッド入力検知

  2. タッチされた座標を取得

  3. 上下左右のどの部分が押されたかを判定

  4. 上下なら移動量、左右なら回転量を取得

  5. 取得した移動量と回転量を OVRCameraRig に追加する

入力検知は下記の通り。

if (OVRInput.Get(OVRInput.Button.PrimaryTouchpad) { }

タッチされた座標の取得は下記の通り。

Vector2 pt = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);

上下左右のどの部分が押されたかの判定は下記の通り。

// 方向を enum で定義しておく

public enum ControllerDirection {
Front,
Right,
Back,
Left,
None
}

// 移動座標を取得するメソッドを用意
private ControllerDirection FetchDirection(Vector2 pt) {
if (pt.x < -0.5 && -0.5 < pt.y && pt.y < 0.5) {
return ControllerDirection.Left;
}
if (pt.x > 0.5 && -0.5 < pt.y && pt.y < 0.5) {
return ControllerDirection.Right;
}
if (pt.y < -0.5 && -0.5 < pt.x && pt.x < 0.5) {
return ControllerDirection.Back;
}
if (pt.y > 0.3 && -0.5<pt.x && pt.x<0.5) {
return ControllerDirection.Front;
}

return ControllerDirection.None;
}

移動量と回転量の取得は下記の通り。

// キャラの移動量を取得

public Vector3 FetchMoveVector(Vector2 pt) {
switch (FetchDirection(pt)) {
case ControllerDirection.Front:
return new Vector3(0, 0, 0.5f * Time.deltaTime);
case ControllerDirection.Back:
return new Vector3(0, 0, -0.5f * Time.deltaTime);
default:
return new Vector3(0, 0, 0);
}
}

// キャラの回転量を取得する
public float FetchMoveAngle(Vector2 pt) {
switch (FetchDirection(pt)) {
case ControllerDirection.Right:
return 30f;
case ControllerDirection.Left:
return -30f;
default:
return 0f;
}
}

取得した移動量と回転量の追加は下記の通り。

// 移動量の追加

Camera.transform.Translate(FetchMoveVector(pt));

// 回転量の追加
float angle = _characterMoveCalculator.FetchMoveAngle(pt);
Camera.transform.rotation *= Quaternion.Euler(0, angle, 0);


まとめ

移動と回転の仕方の正解はイマイチ分かっていない為、間違い等があれば指摘して頂けると幸いです。