using UnityEngine; namespace UDE_HAND_INTERACTION { public abstract class InteractDetector : Interactor where interactor : Interactor where interactable : DetectorInteractable { protected void GenerateDetectorEvent(DetectorEventType detectorEventType, interactable interactable) { Pose pose = ComputeDetectorPose(); if (interactable == null) { return; } if (interactable.DetectableElement != null) { if (detectorEventType == DetectorEventType.Hover) { interactable.DetectableElement.WhenDetectorEventRaised += HandleDetectorEventRaised; } else if (detectorEventType == DetectorEventType.Unhover) { interactable.DetectableElement.WhenDetectorEventRaised -= HandleDetectorEventRaised; } } interactable.PublishDetectorEvent( new DetectorEvent(Identifier, detectorEventType, pose)); } protected virtual void HandleDetectorEventRaised(DetectorEvent evt) { if (evt.Identifier == Identifier && evt.Type == DetectorEventType.Cancel && Interactable != null) { interactable interactable = Interactable; interactable.RemoveInteractorByIdentifier(Identifier); interactable.DetectableElement.WhenDetectorEventRaised -= HandleDetectorEventRaised; } } protected override void InteractableSelected(interactable interactable) { base.InteractableSelected(interactable); GenerateDetectorEvent(DetectorEventType.Select, interactable); } protected override void DoPostprocess() { base.DoPostprocess(); if (_interactable != null) { GenerateDetectorEvent(DetectorEventType.Move, _interactable); } } protected abstract Pose ComputeDetectorPose(); } }