MRが楽しい

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

MRTKを用いてHoloLensのフォーカスイベントを検出する

本日は MRTK の技術調査枠です。
MRTKを用いてフォーカスイベントを設定する方法をまとめます。

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

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

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

フォーカスイベント

フォーカスイベントはユーザが特定のオブジェクトにカーソルを合わせた事を検出するイベントです。
HoloLens では視点がカーソルになるので、特定のオブジェクトを注視したことを検出できます。

MRTK の基本設定を行っていれば IFocusable インタフェースの以下の関数を利用してイベントを取得できます。
・IFocusable.cs

using UnityEngine.EventSystems;

namespace HoloToolkit.Unity.InputModule
{
    /// <summary>
    /// Interface to implement to react to focus enter/exit.
    /// </summary>
    public interface IFocusable : IEventSystemHandler
    {
        void OnFocusEnter(); // フォーカス開始時イベント
        void OnFocusExit();  // フォーカス終了時イベント
    }
}

実際にスクリプトを作成してみます。
フォーカス時にオブジェクトサイズが大きくなるスクリプトを作成しました。
・FocusEvent.cs

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

public class FocusEvent : MonoBehaviour,
    IFocusable // IFocusable インタフェースを継承
{
    private Vector3 DefaultScale = new Vector3();

    /// <summary>
    /// 起動時処理
    /// </summary>
    void Start()
    {
        // 初期サイズを保存
        DefaultScale = new Vector3(
            transform.localScale.x,
            transform.localScale.y,
            transform.localScale.z);
    }

    /// <summary>
    /// フォーカス開始時イベント
    /// </summary>
    public void OnFocusEnter()
    {
        // フォーカス時、2倍の大きさに変更
        transform.localScale = DefaultScale * 2.0f;
    }

    /// <summary>
    /// フォーカス終了時イベント
    /// </summary>
    public void OnFocusExit()
    {
        // フォーカスが外れると、元の大きさに戻る
        transform.localScale = DefaultScale;
    }
}

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

[再生]ボタンを押してシーンを開始します。
視点を Sphere に合わせたときのみ、オブジェクトが大きくなります。
f:id:bluebirdofoz:20190127155419j:plain

インタラクテタブルオブジェクト

今回はスクリプトを用いて直接フォーカス時のアクションを実装しました。
MRTK にはオブジェクトに様々なアクションを設定できるインタラクテタブルオブジェクトという機能があります。
オブジェクトをフォーカス時に色変化させたり、タップ時にアニメーションさせることがノンコーディングで可能です。