2023-05-08 15:56:10 +03:00

124 lines
3.9 KiB
C#

using System.Collections.Generic;
#if XR_HANDS
using UnityEngine.XR.Hands;
#endif
namespace UnityEngine.XR.Interaction.Toolkit.Samples.Hands
{
/// <summary>
/// Manages swapping between hands and controllers at runtime based on whether hands are tracked.
/// </summary>
public class HandsAndControllersManager : MonoBehaviour
{
[SerializeField]
[Tooltip("GameObject to toggle on when the left hand is tracked and off when it is not tracked.")]
GameObject m_LeftHand;
[SerializeField]
[Tooltip("GameObject to toggle on when the right hand is tracked and off when it is not tracked.")]
GameObject m_RightHand;
[SerializeField]
[Tooltip("GameObject to toggle off when the left hand is tracked and on when it is not tracked.")]
GameObject m_LeftController;
[SerializeField]
[Tooltip("GameObject to toggle off when the right hand is tracked and on when it is not tracked.")]
GameObject m_RightController;
#if XR_HANDS
XRHandSubsystem m_Subsystem;
static readonly List<XRHandSubsystem> s_Subsystems = new List<XRHandSubsystem>();
#endif
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
protected void OnEnable()
{
#if XR_HANDS
SubsystemManager.GetSubsystems(s_Subsystems);
if (s_Subsystems.Count == 0)
{
Debug.LogWarning("Hand Tracking Subsystem not found, can't subscribe to hand tracking status. Enable that feature in the OpenXR project settings and ensure OpenXR is enabled as the plug-in provider.", this);
ToggleLeftHand(false);
ToggleRightHand(false);
return;
}
m_Subsystem = s_Subsystems[0];
m_Subsystem.trackingAcquired += OnHandTrackingAcquired;
m_Subsystem.trackingLost += OnHandTrackingLost;
var leftHand = m_Subsystem.leftHand;
ToggleHand(leftHand.handedness, leftHand.isTracked);
var rightHand = m_Subsystem.rightHand;
ToggleHand(rightHand.handedness, rightHand.isTracked);
#else
Debug.LogError("Script requires XR Hands (com.unity.xr.hands) package. Install using Window > Package Manager or click Fix on the related issue in Edit > Project Settings > XR Plug-in Management > Project Validation.", this);
ToggleLeftHand(false);
ToggleRightHand(false);
#endif
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
protected void OnDisable()
{
#if XR_HANDS
if (m_Subsystem == null)
return;
m_Subsystem.trackingAcquired -= OnHandTrackingAcquired;
m_Subsystem.trackingLost -= OnHandTrackingLost;
m_Subsystem = null;
#endif
}
void ToggleLeftHand(bool handOn)
{
if (m_LeftHand != null)
m_LeftHand.SetActive(handOn);
if (m_LeftController != null)
m_LeftController.SetActive(!handOn);
}
void ToggleRightHand(bool handOn)
{
if (m_RightHand != null)
m_RightHand.SetActive(handOn);
if (m_RightController != null)
m_RightController.SetActive(!handOn);
}
#if XR_HANDS
void OnHandTrackingAcquired(XRHand hand)
{
ToggleHand(hand.handedness, true);
}
void OnHandTrackingLost(XRHand hand)
{
ToggleHand(hand.handedness, false);
}
void ToggleHand(Handedness handedness, bool handOn)
{
switch (handedness)
{
case Handedness.Left:
ToggleLeftHand(handOn);
break;
case Handedness.Right:
ToggleRightHand(handOn);
break;
}
}
#endif
}
}