121 lines
3.7 KiB
C#

using UnityEngine;
namespace Passer.Humanoid {
using Passer.Tracking;
[System.Serializable]
public class UnityXRHead : HeadSensor {
#if pUNITYXR
public override string name {
get { return "Unity XR"; }
}
protected UnityXRTracker unityXR {
get { return humanoid.unityXR; }
}
#region Manage
public override void CheckSensor(HeadTarget headTarget) {
if (this.headTarget == null)
this.target = headTarget;
if (this.headTarget == null)
return;
if (unityXR.trackerComponent == null) {
unityXR.CheckTracker(humanoid);
}
if (enabled && unityXR.trackerComponent != null && unityXR.trackerComponent.enabled) {
if (hmd == null) {
Vector3 position = headTarget.transform.TransformPoint(headTarget.head2eyes);
Quaternion rotation = headTarget.transform.rotation;
UnityXR unityXRtracker = unityXR.trackerComponent as UnityXR;
hmd = unityXRtracker.GetHmd(position, rotation);
}
if (hmd != null)
sensorTransform = hmd.transform;
if (!Application.isPlaying)
SetSensor2Target();
}
else {
#if UNITY_EDITOR
if (!Application.isPlaying) {
if (hmd != null)
Object.DestroyImmediate(hmd.gameObject, true);
}
#endif
hmd = null;
sensorTransform = null;
}
}
#endregion
#region Start
public override void Start(HumanoidControl _humanoid, Transform targetTransform) {
base.Start(_humanoid, targetTransform);
tracker = headTarget.humanoid.unityXR;
if (tracker == null || !tracker.enabled || !enabled)
return;
Vector3 position = headTarget.transform.TransformPoint(headTarget.head2eyes);
Quaternion rotation = headTarget.transform.rotation;
#if hSTEAMVR && (UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX)
if (UnityXRDevice.xrDevice == UnityXRDevice.XRDeviceType.OpenVR) {
SteamVR steamVRtracker = unityXR.tracker as SteamVR;
hmd = steamVRtracker.GetHmd(position, rotation);
}
else
#endif
{
UnityXR unityXRtracker = unityXR.trackerComponent as UnityXR;
hmd = unityXRtracker.GetHmd(position, rotation);
}
if (hmd != null)
sensorTransform = hmd.transform;
SetSensor2Target();
CheckSensorTransform();
sensor2TargetPosition = -headTarget.head2eyes;
if (hmd != null)
hmd.StartComponent(unityXR.trackerComponent.transform);
}
#endregion
#region Update
protected bool calibrated = false;
public override void Update() {
status = Tracker.Status.Unavailable;
if (unityXR.trackerComponent == null || !unityXR.trackerComponent.enabled || !enabled)
return;
if (hmd == null)
return;
hmd.UpdateComponent();
status = hmd.status;
if (status != Tracker.Status.Tracking)
return;
UpdateTarget(headTarget.head.target, hmd);
UpdateNeckTargetFromHead();
if (!calibrated) {
if (tracker.humanoid.calibrateAtStart)
tracker.humanoid.Calibrate();
calibrated = true;
}
}
#endregion
#endif
}
}