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.
68 lines
2.3 KiB
68 lines
2.3 KiB
|
1 month ago
|
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();
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|