Holograms 101 読解メモ(Gesture部分)

前回の続きです
・GazeGestureManager.cs
AirTapを検知して、その先にオブジェクトがあったらメッセージを送る、という内容です。

using UnityEngine;
using UnityEngine.VR.WSA.Input;
public class GazeGestureManager : MonoBehaviour
{
    public static GazeGestureManager Instance { get; private set; }
    // Represents the hologram that is currently being gazed at.
    public GameObject FocusedObject { get; private set; }
    GestureRecognizer recognizer;
    // Use this for initialization
    void Awake()
    {
        Instance = this;
        // Set up a GestureRecognizer to detect Select gestures.
        recognizer = new GestureRecognizer();
        recognizer.TappedEvent += (source, tapCount, ray) =>
        {
            // Send an OnSelect message to the focused object and its ancestors.
            if (FocusedObject != null)
            {
                FocusedObject.SendMessageUpwards("OnSelect");
            }
        };
        recognizer.StartCapturingGestures();
    }
    // Update is called once per frame
    void Update()
    {
        // Figure out which hologram is focused this frame.
        GameObject oldFocusObject = FocusedObject;
        // Do a raycast into the world based on the user's
        // head position and orientation.
        var headPosition = Camera.main.transform.position;
        var gazeDirection = Camera.main.transform.forward;
        RaycastHit hitInfo;
        if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
        {
            // If the raycast hit a hologram, use that as the focused object.
            FocusedObject = hitInfo.collider.gameObject;
        }
        else
        {
            // If the raycast did not hit a hologram, clear the focused object.
            FocusedObject = null;
        }
        // If the focused object changed this frame,
        // start detecting fresh gestures again.
        if (FocusedObject != oldFocusObject)
        {
            recognizer.CancelGestures();
            recognizer.StartCapturingGestures();
        }
    }
}

まずAwakeで、GestureRecognizerをインスタンス化しています。GestureRecognizerは、Unityが持っているAPIで、デバイスによって認識できるジェスチャーが異なります。(スマホならスワイプなど)
HoloLensの場合、Tapに加えてManipulationやNavigationのジェスチャーを認識することができます。

Tapされたらば、対象となるオブジェクトに”OnSelect”というメッセージを送る、という内容です。(当然、受けるオブジェクト側にメソッドを用意しないといけません)
もっと単純に、対象となったオブジェクトを直接消すとか、Ridgidbodyをくっつけて落とすとか、そういうやり方も可能ですね(ドラッグして動かす、というのも応用範囲が広そうですね)
そしてUpdate()では、視線の先にオブジェクトが存在するかを確認しています。これは前回のカーソルの時とほぼおなじ仕組みです。ちょっと違うのは、対象が変わった場合はGestureの認識をリセットしている、という部分です。
・SphereCommands.cs
こちらは呼び出される側のOnSelect()メソッドを持っています。Rigidbodyがなければくっつける、という内容です。
このように、HoloLensに依存する部分はGestureの種類くらいなので、もっとUnityそのものの勉強をしないとですね・・

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク