MRが楽しい

MRやVRについて学習したことを書き残す

MRTKを用いてHoloLensの長押しタップを検出する

本日は MRTK の技術調査枠です。
MRTKを用いて長押しタップを検出する方法をまとめます。

プロジェクトとシーンの準備

以下の記事を元にHoloLens(WindowsMR)プロジェクトを作成します。
bluebirdofoz.hatenablog.com

2019/2/3現在、MRTK 2017 の最新バージョンは 2017.4.3.0 です。
f:id:bluebirdofoz:20190205010738j:plain

タップダウン・タップアップイベント

長押しタップを検出するにはタップを開始したタップダウンのイベントと、タップを終了したタップアップのイベントを取得します。
タップの開始時刻とタップの終了時刻を比較すれば、どれだけの時間タップを継続していたかが分かります。

MRTK の基本設定を行っていれば IInputHandler インタフェースの以下の関数を利用して各イベントを取得できます。
・OnInputDown:タップダウン検出
・OnInputUp:タップアップ検出

実際にスクリプトを作成してみます。
長押しタップを行うと、オブジェクトのサイズが大きくなるスクリプトを作成しました。
・LongTapEvent.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// IInputHandler を利用するため InputModule を追加
using HoloToolkit.Unity.InputModule;

public class LongTapEvent : MonoBehaviour,
IInputHandler // タップダウン、タップアップ検出
{
    /// <summary>
    /// 長押しタップ検出時間(秒)
    /// </summary>
    [SerializeField, Tooltip("長押しタップ検出時間(秒)")]
    private float LongTapTime = 3.0f;
    /// <summary>

    /// 長押しタップ計測開始時刻
    /// </summary>
    private float p_LongTapStart;

    /// <summary>
    /// 起動時処理
    /// </summary>
    void Start()
    {
        // 全てのジェスチャーイベントをキャッチする
        InputManager.Instance.AddGlobalListener(gameObject);
        // スクリプトをアタッチしたオブジェクトに長押しタップしたときのみ
        // 動作させたい場合、本設定は不要
        // また、本設定を有効にしてColliderオブジェクトにアタッチした場合
        // オブジェクトへのタップとグローバルのタップが
        // 別々に検出される(2回処理が走る)ので注意する
    }

    /// <summary>
    /// タップダウン検出
    /// </summary>
    /// <param name="eventData"></param>
    public void OnInputDown(InputEventData eventData)
    {
        Debug.Log("TapDown!");

        // 現在の時刻を検出時刻として記録
        p_LongTapStart = Time.time;
    }

    /// <summary>
    /// タップアップ検出
    /// </summary>
    /// <param name="eventData"></param>
    public void OnInputUp(InputEventData eventData)
    {
        Debug.Log("TapUp!:" + LongTapTime);

        // 現在時刻の取得
        float nowTime = Time.time;

        // 長押しタップ検出時間より長くタップされていれば長押しと判定
        float tapTime = nowTime - p_LongTapStart;
        if (tapTime > LongTapTime)
        {
            // 長押しタップ処理
            Debug.Log("LongTap");
            // オブジェクトを2倍の大きさに変更
            transform.localScale = transform.localScale * 2.0f;
        }
    }
}

作成したスクリプトSphere オブジェクトにアタッチします。
f:id:bluebirdofoz:20190205010804j:plain

[再生]ボタンを押してシーンを開始します。
[Game]ビュー上で Shift + 左クリック でタップ操作を試験できます。
3秒以上の長押しタップを行うと、オブジェクトが大きくなります。
f:id:bluebirdofoz:20190205010813j:plain

Inspector ビューから LongTapTime 変数を調整すると、長押しタップを検出するタップ時間を調整できます。
f:id:bluebirdofoz:20190205010822j:plain