[HTC VIVE + Unity] レーザーポインターの実装方法 (4)

HTC VIVE用VRアプリ開発でUnityを使用してレーザーポインターを実装する方法を紹介します。
本記事は前回の「[HTC VIVE + Unity] レーザーポインターの実装方法 (3)」の続きです。
今回は、前回追加したレーザーポインターに衝突判定処理を追加する方法を紹介します。

レーザーポインターに衝突判定処理を追加する

当たり判定の動作確認用に3Dゲームオブジェクト「TestCube」を配置します。

当たり判定の挙動は以下のようになるように想定します。

・レーザーポインターがTestCubeに触れたときTestCubeは青色になります。
・レーザーポインターがTestCubeから離れたときTestCubeは黄色になります。
・レーザーポインターがTestCubeに焦点をあわせてトリガーをひいたときTestCubeは赤色になります。

レーザーポインター衝突判定のスクリプト例

上記の挙動になるように設定した衝突判定処理のスクリプトは以下のようになります。
Class名は仮に「LaserPointerHandler」としていますが、名称は任意で構いません。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using Valve.VR.Extras;

public class LaserPointerHandler : MonoBehaviour
{
    //右手用
    public SteamVR_LaserPointer laserPointer;
    //左手用
    public SteamVR_LaserPointer laserPointer2;

    void Awake()
    {
        laserPointer.PointerIn += PointerInside;
        laserPointer.PointerOut += PointerOutside;
        laserPointer.PointerClick += PointerClick;
        laserPointer2.PointerIn += PointerInside;
        laserPointer2.PointerOut += PointerOutside;
        laserPointer2.PointerClick += PointerClick;
    }

    //レーザーポインターをtargetに焦点をあわせてトリガーをひいたとき
    public void PointerClick(object sender, PointerEventArgs e)
    {
        //3Dオブジェクト「TestCube」の色を赤色に変更する
        if (e.target.name == "TestCube")
        {
            GameObject testcube = GameObject.Find("TestCube");
            testcube.GetComponent<Renderer>().material.color = Color.red;
        }
    }

    //レーザーポインターがtargetに触れたとき
    public void PointerInside(object sender, PointerEventArgs e)
    {
        //3Dオブジェクト「TestCube」の色を青色に変更する
        if (e.target.name == "TestCube")
        {
            GameObject testcube = GameObject.Find("TestCube");
            testcube.GetComponent<Renderer>().material.color = Color.blue;
        }
    }

    //レーザーポインターがtargetから離れたとき
    public void PointerOutside(object sender, PointerEventArgs e)
    {
        //3Dオブジェクト「TestCube」の色を黄色に変更する
        if (e.target.name == "TestCube")
        {
            GameObject testcube = GameObject.Find("TestCube");
            testcube.GetComponent<Renderer>().material.color = Color.yellow;
        }
    }
}

上記のスクリプトを空のゲームオブジェクト等にアタッチします。
publicで設定した laserPointer, laserPointer2 には右手/左手それぞれの「SteamVR_LaserPointer」スクリプトをアタッチします。

動作確認

「Play」ボタンを押して動作の確認をします。

レーザーポインターがTestCubeに触れたときTestCubeは青色になります。

レーザーポインターがTestCubeから離れたときTestCubeは黄色になります。

レーザーポインターをTestCubeに焦点をあわせてトリガーをひいたとき、レーザーポインターの光線が緑色になりTestCubeは赤色になります。

以上の動作の確認ができました。

金曜日担当:nishida



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム