// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using Microsoft.MixedReality.Toolkit.Utilities.Editor; using UnityEngine.Events; namespace Microsoft.MixedReality.Toolkit.UI { /// /// A basic grab event receiver for detecting grab events (OnGrab, OnRelease) or grab state changes from Interactable /// When the grab states change, on or off, these events are triggered /// public class InteractableOnGrabReceiver : ReceiverBase { /// /// Invoked on grab release /// [InspectorField(Type = InspectorField.FieldTypes.Event, Label = "On Release", Tooltip = "Grab was released")] public UnityEvent OnRelease = new UnityEvent(); /// /// Invoked on grab start /// public UnityEvent OnGrab => uEvent; private bool hadGrab; /// /// Creates a receiver that raises grab start and end events. /// public InteractableOnGrabReceiver(UnityEvent ev) : base(ev, "OnGrab") { } /// /// Creates a receiver that raises grab start and end events. /// public InteractableOnGrabReceiver() : this(new UnityEvent()) { } /// public override void OnUpdate(InteractableStates state, Interactable source) { bool hasGrab = state.GetState(InteractableStates.InteractableStateEnum.Grab).Value > 0; if (hadGrab != hasGrab) { if (hasGrab) { uEvent.Invoke(); } else { OnRelease.Invoke(); } } hadGrab = hasGrab; } } }