しっぽを追いかけて

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

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

HoloToolkit を Unity 5.5 版に移行(注視に対する反応対応)

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

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

HoloLensToolkit は以前よりもだいぶ設計を見直した(もちろんより良い形に!)ので、昔のコードも修正が必要です

今回は下記の記事で紹介した注視による半透過の反応処理を最新の HoloToolkit 用に移行してみます

matatabi-ux.hateblo.jp

昔のコードでは OnGazeEnter() と OnGazeLeave() という暗黙的なイベントハンドラメソッドを実装することで注視時と注視がはずれた時の処理を記述していました

新しいコードでは、暗黙的なイベントハンドラではなく、私が当初想定したように明示的に IFocusable というインタフェースを実装する形になったようです

f:id:matatabi_ux:20170119202703p:plain

IFocusable のインタフェースが要求するのは OnFocusEnter() と OnFocusExit() で引数なしです

インタフェースを利用するようになったおかげで VisualStudio のサポートを受けられるようになりましたね

というわけで昔のコードの OnGazeEnter() と OnGazeLeave() を OnFocusEnter() と OnFocusExit() に名称変更し、IFocusable インタフェースを実装してみました

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

/// <summary>
/// 注視対象となるパネル(Quad)
/// </summary>
[RequireComponent(typeof(Renderer))]
[RequireComponent(typeof(Material))]
public class TargetPanel : MonoBehaviour, IFocusable
{
    /// <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>
    public void OnSelect()
    {
        this.meshRenderer.material = this.selectedMaterial;
        this.OnFocusEnter();
    }
}

そしてお試しデバッグ

f:id:matatabi_ux:20170119204522g:plain

はい、サクッと注視しているときだけパネルが半透過されるようになりました!

かんたんに移行できましたね