You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.3 KiB
67 lines
2.3 KiB
using UnityEngine; |
|
|
|
namespace UDE_HAND_INTERACTION |
|
{ |
|
public abstract class InteractDetector<interactor, interactable> : |
|
Interactor<interactor, interactable> |
|
where interactor : Interactor<interactor, interactable> |
|
where interactable : DetectorInteractable<interactor, interactable> |
|
{ |
|
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(); |
|
} |
|
|
|
}
|
|
|