[FirstVR]レティクルでリセンター


[前回の記事](https://qiita.com/ponZoo/items/5485a7595a49f8b112cf)から、もっとVRに近づけていこう！ということで今回はVR対応させようと思います。

##GoogleVRのインポート
FirstVRはスマートフォン対応なので、GoogleVRで開発します。

ということで、まずはGoogleVRを実装していきましょう。

以下のリンクから、GoogleVRForUnity_*.unitypackageをダウンロードします。
https://github.com/googlevr/gvr-unity-sdk/releases

ダウンロードしたパッケージを、Unityプロジェクトにインポートしてください。（今回は、前回作ったプロジェクトをそのまま活用したいと思います。）

その他詳細な設定は、以下のGoogleVRのデベロッパーサイトを参考にしてください。
https://developers.google.com/vr/develop/unity/get-started-android

##GoogleVRの実装
GoogleVRの実装に必要なPrefabをヒエラルキーに追加していきます。
必ず必要なのは以下の2つになります。

`GoogleVR / Prefabs / EventSystem / GvrEventSystem`

`GoogleVR / Prefabs / Cardboard / GvrReticlePointer`
GvrReticlePointerは、カメラの子オブジェクトにしてください。

また、Unity上で実行確認したいときは、
`GoogleVR / Prefabs / GvrEditorEmulator`をヒエラルキーに置くと、マウスでヘッドセットの動きを再現できます。

ビルドせずに実機確認したいときは、
`GoogleVR / Prefabs / InstantPreview / GvrInstantPreviewMain`をヒエラルキーに置くことで、確認可能です。

これで、GoogleVRの実装は完了です。

##レティクルでリセンター
せっかくVR対応させたので、前回ボタンで行なっていたリセンターをレティクルで実装しましょう。

今回は、ボタンを2.5秒間見つめたときにリセンターされるようにしました。

まず、前回も書き換えた`SampleViewerManager.cs`を以下のように書き換えます。

```SampleViewerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using FVRlib;

public class SampleViewerManager : MonoBehaviour {

	// FVR 
	public FVRConnection fvr;

	// vars
	public GameObject hand;
	bool touched = false;
    private float time = 0;
    private bool lookingFlg = false;

	void Start () {
        hand = GameObject.Find("Hand_right");
	}


	void Update () {
        hand.transform.rotation = fvr.centeredRotation;

        //if (Input.touchCount == 1&&!touched) {
        //	fvr.Recenter ();
        //	touched = true;
        //}
        //if (Input.touchCount == 0&&touched) {			
        //	touched = false;
        //}

        //lookingFlgが立ったら時間カウント開始
        if (lookingFlg)
        {
            time += Time.deltaTime;
        }

        //見つめ続けている時間が2.5秒以上になったらリセンター
        if(time >= 2.5f)
        {
            fvr.Recenter();
            time = 0;
            lookingFlg = false;
        }
    }

    //public void RecenterButton(){
    //    fvr.Recenter();
    //}

    //ボタンにレティクルがあたったとき
    public void Looking()
    {
        lookingFlg = true;
    }

    //ボタンからレティクルが外れたとき
    public void RemoveEyes()
    {
        lookingFlg = false;
        time = 0;
    }
}
```

今回使用するEvent Triggerでは、レティクルが乗った瞬間を判定する（後述）ので、`Looking()`に直接`time += Time.deltaTime;`を入れてしまうと、一瞬しかカウントアップがされないので気をつけてください。

`SampleViewerManager.cs`を書き換えたら、`RecenterButton`のインスペクターに`Event Trigger`を追加してください。
<img width="1440" alt="スクリーンショット 2018-12-05 16.29.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/300418/1a60f3ff-a808-9212-10dc-6f0bf647850a.png">

そして、`Pointer Enter`と`Pointer Exit`のふたつのEvent Typeを追加してください。
<img width="1440" alt="スクリーンショット 2018-12-05 16.34.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/300418/ff71ca50-8314-c1f1-79ee-a4d5ccbc05a9.png">

`Pointer Enter`のリストを追加して、`SceneManager`にアタッチされている`SampleViewerManager > Looking()`を設定します。
<img width="1440" alt="スクリーンショット 2018-12-05 16.38.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/300418/c5032aac-3a44-0927-88eb-94acfc77106a.png">
<img width="1440" alt="スクリーンショット 2018-12-05 16.38.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/300418/f4e0f86d-0c4c-cd3f-a48d-13573aa9fce9.png">

`Pointer Exit`も同様に、`RemoveEyes()`を設定してください。

これで、リセンターボタンにレティクルが乗ったときとはずれたときの設定ができました。

##実行
では、実際にスマートフォンにビルドして確認してみましょう。
![reticle1.gif](https://qiita-image-store.s3.amazonaws.com/0/300418/29a08a4d-22b8-d2be-8627-8e38b478b7d0.gif)

無事にレティクルでリセンターすることができました！