using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; namespace BNG { /// /// A simple alternative to the TrackedPoseDriver component. /// Feel free to swap this out with a TrackedPoseDriver from the XR Legacy Input Helpers package or using the new Unity Input System /// public class TrackedDevice : MonoBehaviour { public TrackableDevice Device = TrackableDevice.HMD; protected InputDevice deviceToTrack; protected Vector3 initialLocalPosition; protected Quaternion initialLocalRotation; protected Vector3 currentLocalPosition; protected Quaternion currentLocalRotation; protected virtual void Awake() { initialLocalPosition = transform.localPosition; initialLocalRotation = transform.localRotation; } protected virtual void OnEnable() { Application.onBeforeRender += OnBeforeRender; } protected virtual void OnDisable() { Application.onBeforeRender -= OnBeforeRender; } protected virtual void Update() { RefreshDeviceStatus(); UpdateDevice(); } protected virtual void FixedUpdate() { UpdateDevice(); } public virtual void RefreshDeviceStatus() { if (!deviceToTrack.isValid) { if (Device == TrackableDevice.HMD) { deviceToTrack = InputBridge.Instance.GetHMD(); } else if (Device == TrackableDevice.LeftController) { deviceToTrack = InputBridge.Instance.GetLeftController(); } else if (Device == TrackableDevice.RightController) { deviceToTrack = InputBridge.Instance.GetRightController(); } } } public virtual void UpdateDevice() { // Check and assign our device status if (deviceToTrack.isValid) { if (Device == TrackableDevice.HMD) { transform.localPosition = currentLocalPosition = InputBridge.Instance.GetHMDLocalPosition(); transform.localRotation = currentLocalRotation = InputBridge.Instance.GetHMDLocalRotation(); } else if (Device == TrackableDevice.LeftController) { transform.localPosition = currentLocalPosition = InputBridge.Instance.GetControllerLocalPosition(ControllerHand.Left); transform.localRotation = currentLocalRotation = InputBridge.Instance.GetControllerLocalRotation(ControllerHand.Left); } else if (Device == TrackableDevice.RightController) { transform.localPosition = currentLocalPosition = InputBridge.Instance.GetControllerLocalPosition(ControllerHand.Right); transform.localRotation = currentLocalRotation = InputBridge.Instance.GetControllerLocalRotation(ControllerHand.Right); } } } protected virtual void OnBeforeRender() { UpdateDevice(); } } public enum TrackableDevice { HMD, LeftController, RightController } }