// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using Microsoft.MixedReality.Toolkit.Utilities.Editor; using UnityEngine; using UnityEngine.Events; namespace Microsoft.MixedReality.Toolkit.UI { /// /// Basic hold event receiver /// [AddComponentMenu("Scripts/MRTK/SDK/InteractableOnHoldReceiver")] public class InteractableOnHoldReceiver : ReceiverBase { /// /// The amount of time to press before triggering event /// [InspectorField(Type = InspectorField.FieldTypes.Float, Label = "Hold Time", Tooltip = "The amount of time to press before triggering event")] public float HoldTime = 1f; private float clickTimer = 0; private bool hasDown; /// /// Invoked when interactable has been pressed for HoldTime /// public UnityEvent OnHold => uEvent; /// /// Creates receiver that raises OnHold events /// public InteractableOnHoldReceiver(UnityEvent ev) : base(ev, "OnHold") { } /// /// Creates receiver that raises OnHold events /// public InteractableOnHoldReceiver() : this(new UnityEvent()) { } /// public override void OnUpdate(InteractableStates state, Interactable source) { if (state.GetState(InteractableStates.InteractableStateEnum.Pressed).Value > 0 && !hasDown) { hasDown = true; clickTimer = 0; } else if (state.GetState(InteractableStates.InteractableStateEnum.Pressed).Value < 1) { hasDown = false; } if (hasDown && clickTimer < HoldTime) { clickTimer += Time.deltaTime; if (clickTimer >= HoldTime) { uEvent.Invoke(); } } } } }