Unity Udexreal开发插件包
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

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();
}
}