using Unity.XR.CoreUtils; using UnityEngine.XR.Interaction.Toolkit.Interactables; namespace UnityEngine.XR.Interaction.Toolkit.Samples.VisionOS { /// /// Toggle component that can be poked or indirectly interacted with to toggle its state. /// public class ToggleComponent : XRBaseInteractable { [Header("Toggle References")] [SerializeField] Transform m_ToggleBubble; [SerializeField] MeshRenderer m_ToggleBackground; [Header("Toggle Colors")] [SerializeField] Color m_SelectedColor = new Color(.1254f, .5882f, .9529f); [SerializeField] Color m_UnselectedColor = new Color(.1764f, .1764f, .1764f); [Header("Toggle Animation")] [SerializeField] float m_TransitionDuration = 0.15f; [Header("Toggle Events")] [SerializeField] BoolUnityEvent m_OnToggleChanged; bool m_IsOn = true; bool m_IsAnimating; Vector3 m_BubbleOnTargetPosition; Vector3 m_BubbleOffTargetPosition; float m_StartLerpTime; const float k_BubbleOnPosition = -0.17f; const float k_BubbleOffPosition = 0.17f; Material m_MaterialInstance; void Start() { var bubblePosition = m_ToggleBubble.localPosition; m_BubbleOnTargetPosition = new Vector3(k_BubbleOnPosition, bubblePosition.y, bubblePosition.z); m_BubbleOffTargetPosition = new Vector3(k_BubbleOffPosition, bubblePosition.y, bubblePosition.z); m_MaterialInstance = m_ToggleBackground.material; SetBubbleColor(m_IsOn ? m_SelectedColor : m_UnselectedColor); } /// protected override void OnSelectEntered(SelectEnterEventArgs args) { base.OnSelectEntered(args); m_IsOn = !m_IsOn; m_StartLerpTime = Time.time; m_IsAnimating = true; m_OnToggleChanged?.Invoke(m_IsOn); } void Update() { if (!m_IsAnimating) return; var lerpPercentage = Mathf.Clamp01(Time.time - m_StartLerpTime) / m_TransitionDuration; m_ToggleBubble.localPosition = Vector3.Lerp( m_IsOn ? m_BubbleOffTargetPosition : m_BubbleOnTargetPosition, m_IsOn ? m_BubbleOnTargetPosition : m_BubbleOffTargetPosition, lerpPercentage); SetBubbleColor(Color.Lerp(m_IsOn ? m_UnselectedColor : m_SelectedColor, m_IsOn ? m_SelectedColor : m_UnselectedColor, lerpPercentage)); if (lerpPercentage >= 1f) m_IsAnimating = false; } void SetBubbleColor(Color color) { m_MaterialInstance.color = color; } } }