Introduction

前回の記事 で表示されたサンプルアプリは、没入型のせいか、コントローラーすらも表示されず何もできなかったし、視点の変更もできなかったので、これらを改善していく。

ここでは Unity 2021.3.5f1 で説明する。
前提として Oculus Integration が既にインストール済みであること。

サンプルソースは、GitHub に置きました。

How to resolve?

改善点は 2 つ

  • 視点の変更ができなかった
  • コントローラーが表示できない

視点の変更

原因はこれ。

UnityでVRのサポートを有効にすると、自動的にヘッドセットにより、頭と位置トラッキングの参照がUnityに渡されます。それによりカメラの位置と向きが、現実世界でのユーザーの位置および向きとぴったり一致するようになります。トラッキング対象のヘッドポーズの値により、カメラの変換値がオーバーライドされるため、カメラの位置は、常にプレイヤーオブジェクトを基準とした相対位置になります。

また

アプリのデザインに応じて、プレーヤーオブジェクトを参照するスクリプトを作成し、そのスクリプトをOVRCameraRigにアタッチするとよいでしょう。

とあるので、カメラを変更します。

幸い、上の記述の直後、シーンにOVRCameraRigを追加する というセクションでカメラの交換手順が記載されているのでそれに従う。

  1. Hierarchy から Main Camera を削除

Delete

  1. Project から Asset -> Oculus -> VR -> Prefabs を選択して、その中の OVRCameraRig をシーンにドラッグアンドドロップ

OVRCameraRig

OVRCameraRig

カメラの Position は適当だが、これで Build して実行すると、今度は視点を動かすことができた。

コントローラーの表示

これは下記のページを参考にさせていただいた。

  1. Project から Asset -> Oculus -> VR -> Prefabs を選択して、その中の OVRControllerPrefab
  • OVRCameraRig -> TrackingSpace -> LeftHandAnchor -> LeftControllerAnchor
  • OVRCameraRig -> TrackingSpace -> RightHandAnchor -> RightControllerAnchor

の配下にドラッグアンドドロップ

Controller

  1. LeftControllerAnchor 配下の OVRControllerPrefab の Controller を L Touch に変更

Controller

  1. RightControllerAnchor 配下の OVRControllerPrefab の Controller を R Touch に変更

Controller

これで Build して実行すると、コントローラーが表示されるようになった。

Controller

でも、トリガーを押下してもレーザーが出ない…

レーザーを出す

これは下記のページを参考にさせていただいた。

レーザーもシーンの中に登場するオブジェクトだから作れ、ということらしい。
没入型では何かもが手作りなのか…

ただし、上の記事が古いためか、Unity のバージョンが新しいのか、元のコードではコントローラーを取得できなかったので、かなり手直しをした。

  1. Project 配下の Assets の下に Scripts フォルダを作り、Scripts フォルダを選択した状態で右クリックし、Create -> C# Script から LaserPointerBehaviour というスクリプトを作成 (LaserPointer という名前のクラスは名前衝突で作れない)

Laser

中身は下記。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using UnityEngine;

public class LaserPointerBehaviour : MonoBehaviour
{

#region SerializeFields

[SerializeField]
private Transform _HandAnchor;

[SerializeField]
private OVRInput.Controller _TargetController;

[SerializeField]
private float _MaxDistance = 100.0f;

[SerializeField]
private LineRenderer _LaserPointerRenderer;

#endregion

#region Methods

#region Magic Methods

void Update()
{
var connected = OVRInput.IsControllerConnected(this._TargetController);
if (!connected)
return;

// Cast ray from controller
var pointerRay = new Ray(this._HandAnchor.position, this._HandAnchor.forward);

// 0 is start point
this._LaserPointerRenderer.SetPosition(0, pointerRay.origin);

if (Physics.Raycast(pointerRay, out var hitInfo, this._MaxDistance))
{
// Set end point to hit position if ray intersects with a collider
_LaserPointerRenderer.SetPosition(1, hitInfo.point);
}
else
{
// Extend MaxDistance in the direction if ray does not intersect with a collider
_LaserPointerRenderer.SetPosition(1, pointerRay.origin + pointerRay.direction * this._MaxDistance);
}
}

#endregion

#endregion

}

色々ポイントがあるが、まずはこれで。

  1. シーンの何もないところを右クリックし、Create Emtpy を 2 回実行

Laser

  1. 作成されたそれぞれのオブジェクトの名前を LeftLaserPointerRightLaserPointer に変更

Laser

  1. LaserPointerBehaviour スクリプトを LeftLaserPointerRightLaserPointer にドラッグアンドドロップ

Laser

Laser

  1. LeftLaserPointerRightLaserPointer それぞれの Inspector に追加表示された Hand Anchor、Target Controller の中身を下記のようにマッピングする
  • LeftLaserPointer
    • Hand Anchor
      • OVRCameraRig -> TrackingSpace -> LeftHandAnchor
    • Target Controller
      • L Touch
  • RightLaserPointer
    • Hand Anchor
      • OVRCameraRig -> TrackingSpace -> RightHandAnchor
    • Target Controller
      • R Touch
  1. LeftLaserPointerRightLaserPointer それぞれに対し、Add Component をクリックし、その中の Line Renderer を選択

Laser

  1. Color を赤色、Width に 0.010、Material の Element 0 には Sprites Default を選択

Laser

  1. 作った Line Renderer を スクリプトの属性として表示された Laser Poiner Renderer にドラッグアンドドロップ

Laser

Result

これで Build して実行すると、コントローラーとレーザーが表示されるようになった。

Controller

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/Unity/Oculus/01_ShowController