読者です 読者をやめる 読者になる 読者になる

しっぽを追いかけて

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

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

HoloLens で Unity の Button の注視を検出してみる

C# Unity UWP VR Windows 10 Windows ランタイムアプリ

※ これは 2016/05/31 Unity HoloLens Technical Preview ver.5.4.0beta14(Windows版) 時点の情報です

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

前々回 は主に Oculus Rift と GearVR 用だった VR UI サンプルを HoloLens で試してみましたが、どうも未対応みたいでした

そんななか、同じ Windows Development の Microsoft MVP である中村さんに情報をいただきました

さっそく Holograms 101Eチュートリアルを見るとその中でジェスチャ認識のチュートリアル動画が

www.youtube.com

そもそも対象の選択の時点で、これまでの Unity 公式の VR サンプル資産は関係なしに自前で Raycast 当てて検出してた・・・HoloLens は後発のデバイスなのでしょうがないですね;

というわけでこちらの動画も参考にとりあえず Button 上に視線があたったらマウスオーバー的な変化をする処理を試してみようと思います

Raycast で衝突判定するには対象に Colider が必要・・・まずは Unity Editor 上で

f:id:matatabi_ux:20160613210600p:plain

Button に被衝突判定を行うための Box Colider を追加しました(普通の uGUI ではやらないと思う)

緑色の矩形が対象範囲となるので、x、y を見た目の Button の大きさに合うように調整しています

次に Script 側

public class VRUI : MonoBehaviour
{
    /// <summary>
    /// ボタンのラベルテキスト
    /// </summary>
    [SerializeField]
    private UnityEngine.UI.Text buttonLabel;

    /// <summary>
    /// 定期的な処理
    /// </summary>
    public void FixedUpdate()
    {
        RaycastHit hit;
        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit))
        {
            var target = hit.collider.gameObject.GetComponent<Button>();
            if (target != null)
            {
                this.OnButtonOver();
            }
        }
        else
        {
            this.OnButtonOut();
        }
    }

    /// <summary>
    /// 視線オーバーイベントハンドラ
    /// </summary>
    private void OnButtonOver()
    {
        this.buttonLabel.text = "Over";
    }

    /// <summary>
    /// 視線アウトイベントハンドラ
    /// </summary>
    private void OnButtonOut()
    {
        this.buttonLabel.text = "Button";
    }

    /// <summary>
    /// 視線クリックイベントハンドラ
    /// </summary>
    private void OnButtonClick()
    {
        this.buttonLabel.text = "Clicked";
    }
}

FixedUpdate メソッドを追加して、Physics.Raycast でメインカメラ(着用者の視線と同一)の位置から向いている方向に Raycast を飛ばして最初に衝突するものを取得します

衝突物があったら GameObject をとって GetComponent で Button が取れたら実用的ではないですが視線が Button にあると判定して Over、それ以外は Button にラベルを変更します

なぜかチュートリアル動画では Update メソッドの中で衝突判定していたのですが、物理演算系の判定は FixedUpdate の方が同期しやすいのでこっちにしました

ここまでやったら UWP プロジェクトをエクスポートして お試し HoloLens エミュレーター

f:id:matatabi_ux:20160613211500g:plain

おお今度は思い通りにできた・・・うーん;