概要
OculusGoでのキャラクター移動関連についてまとめる。
初期設定
- UnityではじめるOculus Go VRアプリ開発 (Mac OS) - Qiita をやる
- AssetStore で Oculus Integration の追加
- MainCamera を削除し、OVRCameraRig を追加する
- OVRCameraRig の子にキャラクターを配置
コントローラの入力について
入力の受け取りは下記の通り。
// 押下げた瞬間
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)) {
// 処理
}
移動の仕組みについて
タッチパッドの入力を検知したら、どの部分が押されたかを取得する。
その後、押された部分によって移動方向を確定する。
- タッチパッド入力検知
- タッチされた座標を取得
- 上下左右のどの部分が押されたかを判定
- 上下なら移動量、左右なら回転量を取得
- 取得した移動量と回転量を 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);
まとめ
移動と回転の仕方の正解はイマイチ分かっていない為、間違い等があれば指摘して頂けると幸いです。