5 using System.Collections.Generic;
9 #if UNITY_WSA || UNITY_STANDALONE_WIN 27 private readonly List<GameObject> globalListeners =
new List<GameObject>(0);
28 private readonly Stack<GameObject> modalInputStack =
new Stack<GameObject>();
29 private readonly Stack<GameObject> fallbackInputStack =
new Stack<GameObject>();
36 public GameObject OverrideFocusedObject {
get;
set; }
38 private int disabledRefCount;
53 #if UNITY_WSA || UNITY_STANDALONE_WIN 61 private static readonly List<InputSourceInfo> detectedInputSources =
new List<InputSourceInfo>(0);
66 public List<InputSourceInfo> DetectedInputSources {
get {
return detectedInputSources; } }
71 public bool IsInputEnabled
73 get {
return disabledRefCount <= 0; }
79 [Obsolete(
"Will be removed in a future release. If you need to know if a specific pointer should send Unity UI Events use FocusManager.Instance.GetSpecificPointerEventData()!=null")]
80 public bool ShouldSendUnityUiEvents {
get {
return FocusManager.
Instance.GetGazePointerEventData() != null && EventSystem.current != null; } }
89 modalInputStack.Push(inputHandler);
97 if (modalInputStack.Count > 0)
99 modalInputStack.Pop();
109 modalInputStack.Clear();
119 globalListeners.Add(listener);
128 globalListeners.Remove(listener);
138 fallbackInputStack.Push(inputHandler);
146 fallbackInputStack.Pop();
154 fallbackInputStack.Clear();
166 if (disabledRefCount == 1)
168 InputDisabled.RaiseEvent();
179 Debug.Assert(disabledRefCount >= 0,
"Tried to pop more input disable than the amount pushed.");
181 if (disabledRefCount == 0)
183 InputEnabled.RaiseEvent();
192 bool wasInputDisabled = disabledRefCount > 0;
193 disabledRefCount = 0;
195 if (wasInputDisabled)
197 InputEnabled.RaiseEvent();
201 private void InitializeEventDatas()
216 #if UNITY_WSA || UNITY_STANDALONE_WIN 227 InitializeEventDatas();
234 Debug.LogError(
"InputManager requires an active FocusManager in the scene");
238 #endregion // Unity APIs 240 public void HandleEvent<T>(BaseEventData eventData, ExecuteEvents.EventFunction<T> eventHandler) where T : IEventSystemHandler
242 if (!Instance.enabled || disabledRefCount > 0)
247 Debug.Assert(!eventData.used);
250 GameObject focusedObject = (OverrideFocusedObject == null) ?
FocusManager.
Instance.TryGetFocusedObject(eventData) : OverrideFocusedObject;
253 for (
int i = 0; i < globalListeners.Count; i++)
256 ExecuteEvents.Execute(globalListeners[i], eventData, eventHandler);
270 if (modalInputStack.Count > 0)
272 GameObject modalInput = modalInputStack.Peek();
276 if (focusedObject != null && modalInput != null && focusedObject.transform.IsChildOf(modalInput.transform))
278 if (ExecuteEvents.ExecuteHierarchy(focusedObject, eventData, eventHandler) && eventData.used)
286 if (ExecuteEvents.ExecuteHierarchy(modalInput, eventData, eventHandler) && eventData.used)
294 if (focusedObject != null)
296 if (ExecuteEvents.ExecuteHierarchy(focusedObject, eventData, eventHandler) && eventData.used)
303 if (fallbackInputStack.Count > 0)
305 GameObject fallbackInput = fallbackInputStack.Peek();
306 if (ExecuteEvents.ExecuteHierarchy(fallbackInput, eventData, eventHandler) && eventData.used)
315 private static readonly ExecuteEvents.EventFunction<
IFocusable> OnFocusEnterEventHandler =
316 delegate (
IFocusable handler, BaseEventData eventData)
327 ExecuteEvents.ExecuteHierarchy(focusedObject, null, OnFocusEnterEventHandler);
331 if (pointerInputEventData != null)
333 ExecuteEvents.ExecuteHierarchy(focusedObject, pointerInputEventData, ExecuteEvents.pointerEnterHandler);
337 private static readonly ExecuteEvents.EventFunction<
IFocusable> OnFocusExitEventHandler =
338 delegate (
IFocusable handler, BaseEventData eventData)
349 ExecuteEvents.ExecuteHierarchy(deFocusedObject, null, OnFocusExitEventHandler);
353 if (pointerInputEventData != null)
355 ExecuteEvents.ExecuteHierarchy(deFocusedObject, pointerInputEventData, ExecuteEvents.pointerExitHandler);
381 if (oldFocusedObject != null)
384 ExecuteEvents.ExecuteHierarchy(oldFocusedObject, pointerSpecificEventData, OnPointerSpecificFocusExitEventHandler);
387 if (newFocusedObject != null)
390 ExecuteEvents.ExecuteHierarchy(newFocusedObject, pointerSpecificEventData, OnPointerSpecificFocusEnterEventHandler);
394 #endregion // Focus Events 396 #region Generic Input Events 398 private static readonly ExecuteEvents.EventFunction<
IInputClickHandler> OnInputClickedEventHandler =
408 sourceClickedEventData.
Initialize(source, sourceId, tags, pressType, tapCount);
411 HandleEvent(sourceClickedEventData, OnInputClickedEventHandler);
416 private static readonly ExecuteEvents.EventFunction<
IInputHandler> OnSourceUpEventHandler =
419 var casted = ExecuteEvents.ValidateEventData<
InputEventData>(eventData);
426 inputEventData.
Initialize(source, sourceId, tags, pressType);
429 HandleEvent(inputEventData, OnSourceUpEventHandler);
438 pointerInputEventData.
SourceId = sourceId;
440 if (pointerInputEventData.selectedObject != null)
442 ExecuteEvents.ExecuteHierarchy(pointerInputEventData.selectedObject, pointerInputEventData, ExecuteEvents.pointerUpHandler);
443 ExecuteEvents.ExecuteHierarchy(pointerInputEventData.selectedObject, pointerInputEventData, ExecuteEvents.pointerClickHandler);
446 pointerInputEventData.
Clear();
450 private static readonly ExecuteEvents.EventFunction<
IInputHandler> OnSourceDownEventHandler =
453 var casted = ExecuteEvents.ValidateEventData<
InputEventData>(eventData);
460 inputEventData.
Initialize(source, sourceId, tags, pressType);
463 HandleEvent(inputEventData, OnSourceDownEventHandler);
472 pointerInputEventData.
SourceId = sourceId;
473 pointerInputEventData.pointerId = (int)sourceId;
475 pointerInputEventData.eligibleForClick =
true;
476 pointerInputEventData.delta = Vector2.zero;
477 pointerInputEventData.dragging =
false;
478 pointerInputEventData.useDragThreshold =
true;
479 pointerInputEventData.pressPosition = pointerInputEventData.position;
480 pointerInputEventData.pointerPressRaycast = pointerInputEventData.pointerCurrentRaycast;
482 if (pointerInputEventData.selectedObject != null)
484 ExecuteEvents.ExecuteHierarchy(pointerInputEventData.selectedObject, pointerInputEventData, ExecuteEvents.pointerDownHandler);
489 #endregion // Generic Input Events 491 #region Source State Events 493 private static readonly ExecuteEvents.EventFunction<
ISourceStateHandler> OnSourceDetectedEventHandler =
502 AddSource(source, sourceId);
505 sourceStateEventData.
Initialize(source, sourceId, tags);
508 HandleEvent(sourceStateEventData, OnSourceDetectedEventHandler);
511 private static readonly ExecuteEvents.EventFunction<
ISourceStateHandler> OnSourceLostEventHandler =
520 RemoveSource(source, sourceId);
523 sourceStateEventData.
Initialize(source, sourceId, tags);
526 HandleEvent(sourceStateEventData, OnSourceLostEventHandler);
531 #region Manipulation Events 533 private static readonly ExecuteEvents.EventFunction<
IManipulationHandler> OnManipulationStartedEventHandler =
543 manipulationEventData.
Initialize(source, sourceId, tags, Vector3.zero);
546 HandleEvent(manipulationEventData, OnManipulationStartedEventHandler);
549 private static readonly ExecuteEvents.EventFunction<
IManipulationHandler> OnManipulationUpdatedEventHandler =
559 manipulationEventData.
Initialize(source, sourceId, tags, cumulativeDelta);
562 HandleEvent(manipulationEventData, OnManipulationUpdatedEventHandler);
565 private static readonly ExecuteEvents.EventFunction<
IManipulationHandler> OnManipulationCompletedEventHandler =
575 manipulationEventData.
Initialize(source, sourceId, tags, cumulativeDelta);
578 HandleEvent(manipulationEventData, OnManipulationCompletedEventHandler);
581 private static readonly ExecuteEvents.EventFunction<
IManipulationHandler> OnManipulationCanceledEventHandler =
591 manipulationEventData.
Initialize(source, sourceId, tags, Vector3.zero);
594 HandleEvent(manipulationEventData, OnManipulationCanceledEventHandler);
597 #endregion // Manipulation Events 601 private static readonly ExecuteEvents.EventFunction<
IHoldHandler> OnHoldStartedEventHandler =
602 delegate (
IHoldHandler handler, BaseEventData eventData)
611 holdEventData.
Initialize(source, sourceId, tags);
614 HandleEvent(holdEventData, OnHoldStartedEventHandler);
617 private static readonly ExecuteEvents.EventFunction<
IHoldHandler> OnHoldCompletedEventHandler =
618 delegate (
IHoldHandler handler, BaseEventData eventData)
627 holdEventData.
Initialize(source, sourceId, tags);
630 HandleEvent(holdEventData, OnHoldCompletedEventHandler);
633 private static readonly ExecuteEvents.EventFunction<
IHoldHandler> OnHoldCanceledEventHandler =
634 delegate (
IHoldHandler handler, BaseEventData eventData)
643 holdEventData.
Initialize(source, sourceId, tags);
646 HandleEvent(holdEventData, OnHoldCanceledEventHandler);
649 #endregion // Hold Events 651 #region Navigation Events 653 private static readonly ExecuteEvents.EventFunction<
INavigationHandler> OnNavigationStartedEventHandler =
663 navigationEventData.
Initialize(source, sourceId, tags, Vector3.zero);
666 HandleEvent(navigationEventData, OnNavigationStartedEventHandler);
669 private static readonly ExecuteEvents.EventFunction<
INavigationHandler> OnNavigationUpdatedEventHandler =
679 navigationEventData.
Initialize(source, sourceId, tags, normalizedOffset);
682 HandleEvent(navigationEventData, OnNavigationUpdatedEventHandler);
685 private static readonly ExecuteEvents.EventFunction<
INavigationHandler> OnNavigationCompletedEventHandler =
695 navigationEventData.
Initialize(source, sourceId, tags, normalizedOffset);
698 HandleEvent(navigationEventData, OnNavigationCompletedEventHandler);
701 private static readonly ExecuteEvents.EventFunction<
INavigationHandler> OnNavigationCanceledEventHandler =
711 navigationEventData.
Initialize(source, sourceId, tags, Vector3.zero);
714 HandleEvent(navigationEventData, OnNavigationCanceledEventHandler);
717 #endregion // Navigation Events 719 #region Controller Events 721 private static readonly ExecuteEvents.EventFunction<
IControllerInputHandler> OnInputPositionChangedEventHandler =
731 inputPositionEventData.
Initialize(source, sourceId, tags, pressType, position);
734 HandleEvent(inputPositionEventData, OnInputPositionChangedEventHandler);
737 private static readonly ExecuteEvents.EventFunction<
ISelectHandler> OnSelectPressedAmountChangedEventHandler =
747 selectPressedEventData.
Initialize(source, sourceId, tags, pressedAmount);
750 HandleEvent(selectPressedEventData, OnSelectPressedAmountChangedEventHandler);
766 HandleEvent(inputEventData, OnTouchpadTouchedEventHandler);
782 HandleEvent(inputEventData, OnTouchpadReleasedEventHandler);
785 private static readonly ExecuteEvents.EventFunction<
ISourcePositionHandler> OnSourcePositionChangedEventHandler =
795 sourcePositionEventData.
Initialize(source, sourceId, tags, pointerPosition, gripPosition);
798 HandleEvent(sourcePositionEventData, OnSourcePositionChangedEventHandler);
801 private static readonly ExecuteEvents.EventFunction<
ISourceRotationHandler> OnSourceRotationChangedEventHandler =
811 sourceRotationEventData.
Initialize(source, sourceId, tags, pointerRotation, gripRotation);
814 HandleEvent(sourceRotationEventData, OnSourceRotationChangedEventHandler);
817 #endregion // Controller Events 819 [Obsolete(
"Use RaiseSourceDetected")]
824 [Obsolete(
"Use RaiseSourceLost")]
829 #region Xbox Controller Events 841 xboxControllerEventData.
Initialize(source, sourceId, inputData);
844 HandleEvent(xboxControllerEventData, OnXboxInputUpdateHandler);
847 #endregion // Xbox Controller Events 849 #region Bounding Box Rig Activity Events 850 private static readonly ExecuteEvents.EventFunction<
IBoundingBoxStateHandler> OnBoundingBoxRigActivatedEventHandler =
860 boundingBoxActivityEventData.
Initialize(boundingBoxRiggedObject);
863 HandleEvent(boundingBoxActivityEventData, OnBoundingBoxRigActivatedEventHandler);
866 private static readonly ExecuteEvents.EventFunction<
IBoundingBoxStateHandler> OnBoundingBoxRigDeactivatedEventHandler =
876 boundingBoxActivityEventData.
Initialize(boundingBoxRiggedObject);
879 HandleEvent(boundingBoxActivityEventData, OnBoundingBoxRigDeactivatedEventHandler);
881 #endregion // Bounding Box Rig Activity Events 883 #if UNITY_WSA || UNITY_STANDALONE_WIN 884 #region Speech Events 886 private static readonly ExecuteEvents.EventFunction<
ISpeechHandler> OnSpeechKeywordRecognizedEventHandler =
893 public void RaiseSpeechKeywordPhraseRecognized(
IInputSource source, uint sourceId, ConfidenceLevel confidence, TimeSpan phraseDuration, DateTime phraseStartTime, SemanticMeaning[] semanticMeanings,
string text,
object[] tags = null)
896 speechEventData.Initialize(source, sourceId, tags, confidence, phraseDuration, phraseStartTime, semanticMeanings, text);
899 HandleEvent(speechEventData, OnSpeechKeywordRecognizedEventHandler);
902 #endregion // Speech Events 904 #region Dictation Events 906 private static readonly ExecuteEvents.EventFunction<
IDictationHandler> OnDictationHypothesisEventHandler =
913 public void RaiseDictationHypothesis(
IInputSource source, uint sourceId,
string dictationHypothesis, AudioClip dictationAudioClip = null,
object[] tags = null)
916 dictationEventData.
Initialize(source, sourceId, tags, dictationHypothesis, dictationAudioClip);
919 HandleEvent(dictationEventData, OnDictationHypothesisEventHandler);
922 private static readonly ExecuteEvents.EventFunction<
IDictationHandler> OnDictationResultEventHandler =
929 public void RaiseDictationResult(
IInputSource source, uint sourceId,
string dictationResult, AudioClip dictationAudioClip = null,
object[] tags = null)
932 dictationEventData.
Initialize(source, sourceId, tags, dictationResult, dictationAudioClip);
935 HandleEvent(dictationEventData, OnDictationResultEventHandler);
938 private static readonly ExecuteEvents.EventFunction<
IDictationHandler> OnDictationCompleteEventHandler =
945 public void RaiseDictationComplete(
IInputSource source, uint sourceId,
string dictationResult, AudioClip dictationAudioClip,
object[] tags = null)
948 dictationEventData.
Initialize(source, sourceId, tags, dictationResult, dictationAudioClip);
951 HandleEvent(dictationEventData, OnDictationCompleteEventHandler);
954 private static readonly ExecuteEvents.EventFunction<
IDictationHandler> OnDictationErrorEventHandler =
961 public void RaiseDictationError(
IInputSource source, uint sourceId,
string dictationResult, AudioClip dictationAudioClip = null,
object[] tags = null)
964 dictationEventData.
Initialize(source, sourceId, tags, dictationResult, dictationAudioClip);
967 HandleEvent(dictationEventData, OnDictationErrorEventHandler);
970 #endregion // Dictation Events 975 private static void AddSource(
IInputSource source, uint sourceId)
977 bool alreadyDetected =
false;
979 for (
int i = 0; i < detectedInputSources.Count; i++)
981 if (detectedInputSources[i].Matches(source, sourceId))
983 alreadyDetected =
true;
988 if (!alreadyDetected)
994 private static void RemoveSource(
IInputSource source, uint sourceId)
996 for (
int iDetected = 0; iDetected < detectedInputSources.Count; iDetected++)
998 if (detectedInputSources[iDetected].Matches(source, sourceId))
1000 detectedInputSources.RemoveAt(iDetected);