TrackerIndexManager.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Text;
  4. using UnityEngine;
  5. using Valve.VR;
  6. using Debug = UnityEngine.Debug;
  7. namespace Tracking
  8. {
  9. public class TrackerIndexManager : MonoBehaviour
  10. {
  11. private IEnumerable<IViveTracker> trackers;
  12. private void OnEnable()
  13. {
  14. SteamVR_Events.DeviceConnected.Listen(OnDeviceConnected);
  15. trackers = GetComponentsInChildren<IViveTracker>();
  16. }
  17. private void OnDeviceConnected(int index, bool connected)
  18. {
  19. if (index < 0) return;
  20. if (!connected || OpenVR.System == null) return;
  21. var deviceClass = OpenVR.System.GetTrackedDeviceClass((uint) index);
  22. if (deviceClass != ETrackedDeviceClass.GenericTracker) return;
  23. /* if (deviceClass == ETrackedDeviceClass.HMD)
  24. {
  25. //OpenVR.System.GetFloatTrackedDeviceProperty(ETrackedDeviceProperty.Prop_UserIpdMeters_Float)
  26. Debug.Log("Controller got connected at index:" + index);
  27. }*/
  28. var error = ETrackedPropertyError.TrackedProp_Success;
  29. var serialNumberBuilder = new StringBuilder();
  30. OpenVR.System.GetStringTrackedDeviceProperty((uint) index,
  31. ETrackedDeviceProperty.Prop_SerialNumber_String, serialNumberBuilder, 64, ref error);
  32. if (error != ETrackedPropertyError.TrackedProp_Success)
  33. {
  34. Debug.LogError($"Could not get serial number for tracker at index {index}");
  35. }
  36. else
  37. {
  38. UpdateTrackerObject(serialNumberBuilder.ToString(), index);
  39. }
  40. }
  41. private void UpdateTrackerObject(string id, int index)
  42. {
  43. Debug.Log($"Tracker with serial number {id} got connected at index {index}");
  44. var t = trackers.FirstOrDefault(tracker => tracker.Id == id);
  45. t?.TrackedObject.SetDeviceIndex(index);
  46. }
  47. }
  48. }