wirm/Game/Assets/Samples/XR Interaction Toolkit/3.0.3/Starter Assets/Scripts/ControllerAnimator.cs

84 lines
No EOL
2.9 KiB
C#

using UnityEngine.XR.Interaction.Toolkit.Inputs.Readers;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.StarterAssets
{
/// <summary>
/// Component which reads input values and drives the thumbstick, trigger, and grip transforms
/// to animate a controller model.
/// </summary>
public class ControllerAnimator : MonoBehaviour
{
[Header("Thumbstick")]
[SerializeField]
Transform m_ThumbstickTransform;
[SerializeField]
Vector2 m_StickRotationRange = new Vector2(30f, 30f);
[SerializeField]
XRInputValueReader<Vector2> m_StickInput = new XRInputValueReader<Vector2>("Thumbstick");
[Header("Trigger")]
[SerializeField]
Transform m_TriggerTransform;
[SerializeField]
Vector2 m_TriggerXAxisRotationRange = new Vector2(0f, -15f);
[SerializeField]
XRInputValueReader<float> m_TriggerInput = new XRInputValueReader<float>("Trigger");
[Header("Grip")]
[SerializeField]
Transform m_GripTransform;
[SerializeField]
Vector2 m_GripRightRange = new Vector2(-0.0125f, -0.011f);
[SerializeField]
XRInputValueReader<float> m_GripInput = new XRInputValueReader<float>("Grip");
void OnEnable()
{
if (m_ThumbstickTransform == null || m_GripTransform == null || m_TriggerTransform == null)
{
enabled = false;
Debug.LogWarning($"Controller Animator component missing references on {gameObject.name}", this);
return;
}
m_StickInput?.EnableDirectActionIfModeUsed();
m_TriggerInput?.EnableDirectActionIfModeUsed();
m_GripInput?.EnableDirectActionIfModeUsed();
}
void OnDisable()
{
m_StickInput?.DisableDirectActionIfModeUsed();
m_TriggerInput?.DisableDirectActionIfModeUsed();
m_GripInput?.DisableDirectActionIfModeUsed();
}
void Update()
{
if (m_StickInput != null)
{
var stickVal = m_StickInput.ReadValue();
m_ThumbstickTransform.localRotation = Quaternion.Euler(-stickVal.y * m_StickRotationRange.x, 0f, -stickVal.x * m_StickRotationRange.y);
}
if (m_TriggerInput != null)
{
var triggerVal = m_TriggerInput.ReadValue();
m_TriggerTransform.localRotation = Quaternion.Euler(Mathf.Lerp(m_TriggerXAxisRotationRange.x, m_TriggerXAxisRotationRange.y, triggerVal), 0f, 0f);
}
if (m_GripInput != null)
{
var gripVal = m_GripInput.ReadValue();
var currentPos = m_GripTransform.localPosition;
m_GripTransform.localPosition = new Vector3(Mathf.Lerp(m_GripRightRange.x, m_GripRightRange.y, gripVal), currentPos.y, currentPos.z);
}
}
}
}