しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

HoloToolkit を Unity 5.5 版に移行(対象を選択したら色を変更する)

※ これは 2016/12/11 Windows 10 Anniversary Edition(10.0; Build 14393)、Unity ver.5.5.0f3(Windows版) 時点の情報です

最新版では動作が異なる可能性がありますのでご注意ください

HoloLensToolkit のアップデートに伴う移行作業、今回は下記の記事で紹介していた選択操作の対応をやってみます

matatabi-ux.hateblo.jp

スポンサードリンク

当時は暗黙的イベントハンドラメソッド OnSelect() を実装して対応していました

注視検出の IFocusable と同じように、新しい HoloToolkit では IInputHandler のインタフェースを実装することで移行できそうです

f:id:matatabi_ux:20170120231011p:plain

IInputHandler のインタフェースが要求するのは OnInputDown() と OnInputUp() で引数は InputEventData という入力の付帯情報です

以前は OnSelect() メソッド1つで済ませていましたが、せっかく押下時と押し上げ時を識別できるようになったので、下記のように押し上げ時に選択状態を解除(元の色に戻す)してみます

using HoloToolkit.Unity.InputModule;
using System;
using UnityEngine;

/// <summary>
/// 注視対象となるパネル(Quad)
/// </summary>
[RequireComponent(typeof(Renderer))]
[RequireComponent(typeof(Material))]
public class TargetPanel : MonoBehaviour, IFocusable, IInputHandler
{
    /// <summary>
    /// パネルのレンダラー
    /// </summary>
    private Renderer meshRenderer = null;

    /// <summary>
    /// パネルのマテリアル
    /// </summary>
    private Material defaultMaterial = null;

    /// <summary>
    /// 選択状態のマテリアル
    /// </summary>
    [SerializeField]
    private Material selectedMaterial = null;

    /// <summary>
    /// 初期処理
    /// </summary>
    public void Awake()
    {
        this.meshRenderer = this.GetComponent<Renderer>();
        this.defaultMaterial = this.meshRenderer.material;
    }

    /// <summary>
    /// 注視(フォーカスイン)イベントハンドラ
    /// </summary>
    public void OnFocusEnter()
    {
        var color = this.meshRenderer.material.color;
        this.meshRenderer.material.color = new Color(color.r, color.g, color.b, 0.6f);
    }

    /// <summary>
    /// 注視はずれ(フォーカスアウト)イベントハンドラ
    /// </summary>
    /// <remarks>
    public void OnFocusExit()
    {
        var color = this.meshRenderer.material.color;
        this.meshRenderer.material.color = new Color(color.r, color.g, color.b, 1f);
    }

    /// <summary>
    /// 選択(フォーカス中に人差し指折り曲げ)イベントハンドラ
    /// </summary>
    /// <param name="eventData">イベント付帯情報</param>
    public void OnInputDown(InputEventData eventData)
    {
        this.meshRenderer.material = this.selectedMaterial;
        this.OnFocusEnter();
    }

    /// <summary>
    /// 選択解除(フォーカス中に人差し指折り曲げ解除)イベントハンドラ
    /// </summary>
    /// <param name="eventData">イベント付帯情報</param>
    public void OnInputUp(InputEventData eventData)
    {
        this.meshRenderer.material = this.defaultMaterial;
        this.OnFocusEnter();
    }
}

修正はこれだけ!デバッグ開始!

f:id:matatabi_ux:20170120231713g:plain

視線がパネルに当たってる時だけ指折り操作で選択されるようになりました

前回導入した InputManager.prefab のおかげでハンドジェスチャ―の様子もわかりやすいですね