Unity使用SteamVR插件环境下,自动寻找Tracker设备并绑定

发布于:2025-08-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

使用头盔为HTC Vivo ,SteamVR插件版本为2.7.3

直接上代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;

//首先该脚本和SteamVR_TrackedObject脚本同级绑定在模型身上,注意该示例只
//适合处理使用了一个Tracker的情况
public class FindTrackerExample : MonoBehaviour
{
    //声明设备类型,Tracker一般是该类型
    ETrackedDeviceClass deviceClass = ETrackedDeviceClass.GenericTracker;
    private int deviceIndex = -1;

    IEnumerator Start()
    {
        //确保Tracker设备已经被开启了,且被SteamVR系统管理
        //判断SteamVR系统是否初始化成功了,没成功跳过这一帧继续等待
        while (SteamVR.initializedState != SteamVR.InitializedStates.InitializeSuccess)
        {
            yield return null;
        }

        //遍历所有可能接入的设备,一般是16个
        for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
        {
            if (!OpenVR.System.IsTrackedDeviceConnected((uint)i))
            {
                continue;
            }

            //已连接的设备获取设备类型,判断类型是否相同,通过类型判断是否找到
            //了那个唯一的Tracker
            //注意我假定了只有一个Tracker设备
            if (OpenVR.System.GetTrackedDeviceClass((uint)i) == deviceClass)
            {
                deviceIndex = i;
                break;
            }
        }

        //通过遍历没找到所以还是-1
        if (deviceIndex == -1)
        {
            Debug.LogError("Can't find any usable tracker!");
        }
        else
        {
            GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)deviceIndex;
        }
    }

    /// <summary>
    /// 这个方法可以通过获取的索引得到设备序列号
    /// 可以帮助处理多个Tracker设备的情况
    /// </summary>
    /// <param name="deviceIndex"></param>
    /// <returns></returns>
    private string GetDeviceSerialNumber(uint deviceIndex)
    {
        var error = ETrackedPropertyError.TrackedProp_Success;
        var capacity = OpenVR.System.GetStringTrackedDeviceProperty(deviceIndex,
            ETrackedDeviceProperty.Prop_SerialNumber_String, null, 0, ref error);
        if (capacity > 1)
        {
            var result = new System.Text.StringBuilder((int)capacity);
            OpenVR.System.GetStringTrackedDeviceProperty(deviceIndex, ETrackedDeviceProperty.Prop_SerialNumber_String,
                result, capacity, ref error);
            return result.ToString();
        }

        return "Unknown";
    }
}

 

 


网站公告

今日签到

点亮在社区的每一天
去签到