using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; using UnityEngine.XR.Interaction.Toolkit.Interactables; public class XRInteractionEventLogger : MonoBehaviour { private XRBaseInteractable interactable; private void Awake() => interactable = GetComponent(); private void OnEnable() { if (interactable == null) { Debug.LogError( $"XRInteractionEventLogger on '{gameObject.name}' needs an XRI interactable " + "(for example, XR Grab Interactable or XR Simple Interactable) on the same GameObject. " + "Disabling this logger.", this); enabled = false; return; } interactable.hoverEntered.AddListener(OnHoverEntered); interactable.hoverExited.AddListener(OnHoverExited); interactable.selectEntered.AddListener(OnSelectEntered); interactable.selectExited.AddListener(OnSelectExited); interactable.activated.AddListener(OnActivated); interactable.deactivated.AddListener(OnDeactivated); } private void OnDisable() { if (interactable == null) return; interactable.hoverEntered.RemoveListener(OnHoverEntered); interactable.hoverExited.RemoveListener(OnHoverExited); interactable.selectEntered.RemoveListener(OnSelectEntered); interactable.selectExited.RemoveListener(OnSelectExited); interactable.activated.RemoveListener(OnActivated); interactable.deactivated.RemoveListener(OnDeactivated); } private void OnHoverEntered(HoverEnterEventArgs args) => Log("hover_enter", NameOf(args.interactorObject)); private void OnHoverExited(HoverExitEventArgs args) => Log("hover_exit", NameOf(args.interactorObject)); private void OnSelectEntered(SelectEnterEventArgs args) => Log("select_enter", NameOf(args.interactorObject)); private void OnSelectExited(SelectExitEventArgs args) => Log("select_exit", NameOf(args.interactorObject)); private void OnActivated(ActivateEventArgs args) => Log("activate", NameOf(args.interactorObject)); private void OnDeactivated(DeactivateEventArgs args) => Log("deactivate", NameOf(args.interactorObject)); private void Log(string eventType, string interactorName) { XRSessionLogger.Instance?.LogEvent(eventType, gameObject.name, interactorName); } private static string NameOf(object value) { if (value is Component component) return component.gameObject.name; return value != null ? value.ToString() : "unknown"; } }