Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@ponZoo

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

More than 1 year has passed since last update.

前回の記事から、もっと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を追加してください。
スクリーンショット 2018-12-05 16.29.15.png

そして、Pointer EnterPointer ExitのふたつのEvent Typeを追加してください。
スクリーンショット 2018-12-05 16.34.37.png

Pointer Enterのリストを追加して、SceneManagerにアタッチされているSampleViewerManager > Looking()を設定します。
スクリーンショット 2018-12-05 16.38.34.png
スクリーンショット 2018-12-05 16.38.52.png

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

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

実行

では、実際にスマートフォンにビルドして確認してみましょう。
reticle1.gif

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

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?