using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; [RequireComponent(typeof(XRDirectInteractor))] public class DirectInteractorHelper : MonoBehaviour, IListener { [SerializeField] private LayerMask toggleInteractionLayer = 0; [SerializeField] private EVENT_TYPE deactivationEvent = EVENT_TYPE.DUMMY; private XRDirectInteractor interactor; private void Awake() { interactor = GetComponent<XRDirectInteractor>(); EventManager.Instance.AddListener(deactivationEvent, this); } private void OnEnable() { interactor.hoverEntered.AddListener(OnHoverEnter); interactor.hoverExited.AddListener(OnHoverExit); } private void OnDisable() { interactor.hoverEntered.RemoveListener(OnHoverEnter); interactor.hoverExited.RemoveListener(OnHoverExit); } public void OnHoverEnter(HoverEnterEventArgs args) { if (toggleInteractionLayer == (toggleInteractionLayer | (1 << args.interactable.gameObject.layer))) { interactor.selectActionTrigger = XRBaseControllerInteractor.InputTriggerType.Toggle; } } public void OnHoverExit(HoverExitEventArgs args) { interactor.selectActionTrigger = XRBaseControllerInteractor.InputTriggerType.StateChange; } public void OnEvent<T>(EVENT_TYPE eventType, Component Sender, T param = default) { if (eventType == deactivationEvent) interactor.selectActionTrigger = XRBaseControllerInteractor.InputTriggerType.StateChange; } }