using System; using UnityEngine.XR.Interaction.Toolkit.AffordanceSystem.State; using UnityEngine.XR.Interaction.Toolkit.Interactables; using UnityEngine.XR.Interaction.Toolkit.Locomotion.Teleportation; namespace UnityEngine.XR.Interaction.Toolkit.Samples.StarterAssets { /// /// Helper component that binds an to a /// when the teleport volume sets its destination anchor to a child transform /// of the state provider's originally bound interactable. /// [RequireComponent(typeof(XRInteractableAffordanceStateProvider))] [Obsolete("The Affordance System namespace and all associated classes have been deprecated. The existing affordance system will be moved, replaced and updated with a new interaction feedback system in a future version of XRI.")] public class TeleportVolumeAnchorAffordanceStateLink : MonoBehaviour { [SerializeField] [Tooltip("The teleport volume that will drive affordance states when its destination anchor belongs to this interactable.")] TeleportationMultiAnchorVolume m_ContainingTeleportVolume; /// /// The teleport volume that will drive affordance states when its destination anchor belongs to the /// state provider's originally bound interactable. /// public TeleportationMultiAnchorVolume containingTeleportVolume { get => m_ContainingTeleportVolume; set => m_ContainingTeleportVolume = value; } XRInteractableAffordanceStateProvider m_AffordanceStateProvider; IXRInteractable m_Interactable; /// /// See . /// protected void OnEnable() { m_AffordanceStateProvider = GetComponent(); if (m_AffordanceStateProvider == null) { Debug.LogError($"Missing {nameof(XRInteractableAffordanceStateProvider)} on {gameObject.name}.", this); enabled = false; return; } if (m_ContainingTeleportVolume == null) { Debug.LogError($"Missing {nameof(TeleportationMultiAnchorVolume)} reference on {gameObject.name}.", this); enabled = false; return; } var interactableSource = m_AffordanceStateProvider.interactableSource; m_Interactable = interactableSource != null && interactableSource is IXRInteractable interactable ? interactable : m_AffordanceStateProvider.GetComponentInParent(); if (m_Interactable == null) { Debug.LogError($"Interactable source must be an {nameof(IXRInteractable)}.", this); enabled = false; return; } m_ContainingTeleportVolume.destinationAnchorChanged += OnDestinationAnchorChanged; } /// /// See . /// protected void OnDisable() { if (m_ContainingTeleportVolume != null) m_ContainingTeleportVolume.destinationAnchorChanged -= OnDestinationAnchorChanged; if (m_AffordanceStateProvider != null) m_AffordanceStateProvider.SetBoundInteractionReceiver(m_Interactable); } void OnDestinationAnchorChanged(TeleportationMultiAnchorVolume anchorVolume) { var anchor = anchorVolume.destinationAnchor; if (anchor == null) { m_AffordanceStateProvider.SetBoundInteractionReceiver(m_Interactable); return; } // Use teleport volume to drive affordance states if its current anchor belongs to this interactable m_AffordanceStateProvider.SetBoundInteractionReceiver( anchor.IsChildOf(m_Interactable.transform) ? m_ContainingTeleportVolume : m_Interactable); } } }