From b1ae90757a7ef0e11380603aa5025404a28a7270 Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Thu, 26 Feb 2015 20:42:26 +0000 Subject: [PATCH] Updated AimerInputModele and applied fixes to the tooltip scripts. Removed ghost EventSystem entry from EditorMenu script (unity renamed theirs which created a duplicate from this project) --HG-- branch : develop --- Scripts/AimerInputModule.cs | 197 ++++++++++++++------ Scripts/BoundTooltip/BoundTooltipItem.cs | 4 +- Scripts/BoundTooltip/BoundTooltipTrigger.cs | 4 +- Scripts/Editor/UIExtensionsMenuOptions.cs | 1 - 4 files changed, 140 insertions(+), 66 deletions(-) diff --git a/Scripts/AimerInputModule.cs b/Scripts/AimerInputModule.cs index 5c8f835..edb34e5 100644 --- a/Scripts/AimerInputModule.cs +++ b/Scripts/AimerInputModule.cs @@ -1,92 +1,167 @@ /// Credit Chris Trueman /// Sourced from - http://forum.unity3d.com/threads/use-reticle-like-mouse-for-worldspace-uis.295271/ +using UnityEngine; +using UnityEngine.EventSystems; using System.Collections.Generic; namespace UnityEngine.EventSystems.Extensions { - [RequireComponent(typeof(EventSystem))] [AddComponentMenu("UI/Extensions/Aimer Input Module")] - public class AimerInputModule : BaseInputModule + public class AimerInputModule : PointerInputModule { - public string ActivateAxis = "Interact"; + /// + /// The Input axis name used to activate the object under the reticle. + /// + public string activateAxis = "Interact"; - public static GameObject ObjectUnderAimer; + /// + /// The aimer offset position. Aimer is center screen use this offset to change that. + /// + public Vector2 aimerOffset = new Vector2(0, 0); - public static Camera CurrentPlayerCamera; + /// + /// The object under aimer. A static access field that lets you know what is under the aimer. + /// This field can return null. + /// + public static GameObject objectUnderAimer; protected AimerInputModule() { } - public void Awake() + public override void ActivateModule() { - var StandAloneSystem = GetComponent(); - if (StandAloneSystem != null) - { - Debug.LogError("Aimer Input Module is incompatible with the StandAloneInputSystem, please remove it from the Event System in this scene"); - } - if (!CurrentPlayerCamera) - { - CurrentPlayerCamera = Camera.main; - } - } + StandaloneInputModule StandAloneSystem = GetComponent(); - public override void UpdateModule() - { - GetObjectUnderAimer(); + if (StandAloneSystem != null && StandAloneSystem.enabled) + { + Debug.LogError("Aimer Input Module is incompatible with the StandAloneInputSystem, " + + "please remove it from the Event System in this scene or disable it when this module is in use"); + } } public override void Process() { - if (ObjectUnderAimer) + bool pressed = Input.GetButtonDown(activateAxis); + bool released = Input.GetButtonUp(activateAxis); + + PointerEventData pointer = GetAimerPointerEventData(); + + ProcessInteraction(pointer, pressed, released); + + if (!released) + ProcessMove(pointer); + else + RemovePointerData(pointer); + } + + protected virtual PointerEventData GetAimerPointerEventData() + { + PointerEventData pointerData; + + //Not certain on the use of this. + //I know that -1 is the mouse and anything positive would be a finger/touch, 0 being the first finger, 1 beign the second and so one till the system limit is reached. + //So that is the reason I choose -2. + GetPointerData(-2, out pointerData, true); + + pointerData.Reset(); + + pointerData.position = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f) + aimerOffset; + + eventSystem.RaycastAll(pointerData, m_RaycastResultCache); + var raycast = FindFirstRaycast(m_RaycastResultCache); + pointerData.pointerCurrentRaycast = raycast; + m_RaycastResultCache.Clear(); + return pointerData; + } + + private void ProcessInteraction(PointerEventData pointer, bool pressed, bool released) + { + var currentOverGo = pointer.pointerCurrentRaycast.gameObject; + + objectUnderAimer = ExecuteEvents.GetEventHandler(currentOverGo);//we only want objects that we can submit on. + + if (pressed) { - if (Input.GetButtonDown(ActivateAxis)) + pointer.eligibleForClick = true; + pointer.delta = Vector2.zero; + pointer.pressPosition = pointer.position; + pointer.pointerPressRaycast = pointer.pointerCurrentRaycast; + + // search for the control that will receive the press + // if we can't find a press handler set the press + // handler to be what would receive a click. + var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointer, ExecuteEvents.submitHandler); + + // didnt find a press handler... search for a click handler + if (newPressed == null) { - BaseEventData eventData = GetBaseEventData(); - eventData.selectedObject = ObjectUnderAimer; - ExecuteEvents.Execute(ObjectUnderAimer, eventData, ExecuteEvents.submitHandler); + newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointer, ExecuteEvents.pointerDownHandler); + if (newPressed == null) + newPressed = ExecuteEvents.GetEventHandler(currentOverGo); } + else + { + pointer.eligibleForClick = false; + } + + if (newPressed != pointer.pointerPress) + { + pointer.pointerPress = newPressed; + pointer.rawPointerPress = currentOverGo; + pointer.clickCount = 0; + } + + // Save the drag handler as well + pointer.pointerDrag = ExecuteEvents.GetEventHandler(currentOverGo); + + if (pointer.pointerDrag != null) + ExecuteEvents.Execute(pointer.pointerDrag, pointer, ExecuteEvents.beginDragHandler); + } + + if (released) + { + //Debug.Log("Executing pressup on: " + pointer.pointerPress); + ExecuteEvents.Execute(pointer.pointerPress, pointer, ExecuteEvents.pointerUpHandler); + + //Debug.Log("KeyCode: " + pointer.eventData.keyCode); + + // see if we mouse up on the same element that we clicked on... + var pointerUpHandler = ExecuteEvents.GetEventHandler(currentOverGo); + + // PointerClick + if (pointer.pointerPress == pointerUpHandler && pointer.eligibleForClick) + { + float time = Time.unscaledTime; + + if (time - pointer.clickTime < 0.3f) + ++pointer.clickCount; + else + pointer.clickCount = 1; + pointer.clickTime = time; + + ExecuteEvents.Execute(pointer.pointerPress, pointer, ExecuteEvents.pointerClickHandler); + } + else if (pointer.pointerDrag != null) + { + ExecuteEvents.ExecuteHierarchy(currentOverGo, pointer, ExecuteEvents.dropHandler); + } + + pointer.eligibleForClick = false; + pointer.pointerPress = null; + pointer.rawPointerPress = null; + + if (pointer.pointerDrag != null) + ExecuteEvents.Execute(pointer.pointerDrag, pointer, ExecuteEvents.endDragHandler); + + pointer.pointerDrag = null; } } - List results = new List(); - - private bool GetObjectUnderAimer() + public override void DeactivateModule() { - PointerEventData pointerData = new PointerEventData(eventSystem); - pointerData.worldPosition = CurrentPlayerCamera.transform.position; - - eventSystem.RaycastAll(pointerData, results); - - if (results.Count > 0) - { - RaycastResult rayResult = FindFirstRaycast(results); - if (ObjectUnderAimer != rayResult.gameObject) - { - Debug.Log(rayResult.gameObject.name); - ObjectUnderAimer = rayResult.gameObject; - BaseEventData eData = GetBaseEventData(); - eData.selectedObject = ObjectUnderAimer; - ExecuteEvents.Execute(ObjectUnderAimer, eData, ExecuteEvents.pointerEnterHandler); - } - - results.Clear(); - return true; - } - - //We didn't hit anything - - if (ObjectUnderAimer) - { - BaseEventData eData = GetBaseEventData(); - eData.selectedObject = ObjectUnderAimer; - - ExecuteEvents.Execute(ObjectUnderAimer, eData, ExecuteEvents.pointerExitHandler); - } - - results.Clear(); - ObjectUnderAimer = null; - return false; + base.DeactivateModule(); + ClearSelection(); } } } \ No newline at end of file diff --git a/Scripts/BoundTooltip/BoundTooltipItem.cs b/Scripts/BoundTooltip/BoundTooltipItem.cs index 7294d1e..1f8b890 100644 --- a/Scripts/BoundTooltip/BoundTooltipItem.cs +++ b/Scripts/BoundTooltip/BoundTooltipItem.cs @@ -1,5 +1,5 @@ -///Credit Martin Sharkbomb -///Sourced from - http://forum.unity3d.com/threads/tooltips.264395/#post-1957075 +///Credit Martin Nerurkar // www.martin.nerurkar.de // www.sharkbombs.com +///Sourced from - http://www.sharkbombs.com/2015/02/10/tooltips-with-the-new-unity-ui-ugui/ namespace UnityEngine.UI.Extensions { diff --git a/Scripts/BoundTooltip/BoundTooltipTrigger.cs b/Scripts/BoundTooltip/BoundTooltipTrigger.cs index 2195c7d..9776722 100644 --- a/Scripts/BoundTooltip/BoundTooltipTrigger.cs +++ b/Scripts/BoundTooltip/BoundTooltipTrigger.cs @@ -1,5 +1,5 @@ -///Credit Martin Sharkbomb -///Sourced from - http://forum.unity3d.com/threads/tooltips.264395/#post-1957075 +///Credit Martin Nerurkar // www.martin.nerurkar.de // www.sharkbombs.com +///Sourced from - http://www.sharkbombs.com/2015/02/10/tooltips-with-the-new-unity-ui-ugui/ using UnityEngine.EventSystems; diff --git a/Scripts/Editor/UIExtensionsMenuOptions.cs b/Scripts/Editor/UIExtensionsMenuOptions.cs index 93c37b8..33b34fb 100644 --- a/Scripts/Editor/UIExtensionsMenuOptions.cs +++ b/Scripts/Editor/UIExtensionsMenuOptions.cs @@ -137,7 +137,6 @@ namespace UnityEditor.UI return root; } - [MenuItem("GameObject/UI/EventSystem", false, 2010)] public static void CreateEventSystem(MenuCommand menuCommand) { GameObject parent = menuCommand.context as GameObject;