From e648e09beb7aa017562e68f5fb523e4713d9635a Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Wed, 11 Feb 2015 20:55:13 +0000 Subject: [PATCH 1/2] Added new control template (editor menu only) - progress bar --HG-- branch : develop --- Scripts/Editor/UIExtensionsMenuOptions.cs | 48 ++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/Scripts/Editor/UIExtensionsMenuOptions.cs b/Scripts/Editor/UIExtensionsMenuOptions.cs index 1d2528e..93c37b8 100644 --- a/Scripts/Editor/UIExtensionsMenuOptions.cs +++ b/Scripts/Editor/UIExtensionsMenuOptions.cs @@ -24,7 +24,7 @@ namespace UnityEditor.UI private const string kCheckmarkPath = "UI/Skin/Checkmark.psd"; private static Vector2 s_ThickGUIElementSize = new Vector2(kWidth, kThickHeight); - //private static Vector2 s_ThinGUIElementSize = new Vector2(kWidth, kThinHeight); + private static Vector2 s_ThinGUIElementSize = new Vector2(kWidth, kThinHeight); private static Vector2 s_ImageGUIElementSize = new Vector2(100f, 100f); private static Color s_DefaultSelectableColor = new Color(1f, 1f, 1f, 1f); private static Color s_TextColor = new Color(50f / 255f, 50f / 255f, 50f / 255f, 1f); @@ -747,6 +747,52 @@ namespace UnityEditor.UI } } + [MenuItem("GameObject/UI/Extensions/Progress Bar", false)] + static public void AddSlider(MenuCommand menuCommand) + { + // Create GOs Hierarchy + GameObject root = CreateUIElementRoot("Progress Bar", menuCommand, s_ThinGUIElementSize); + + GameObject background = CreateUIObject("Background", root); + GameObject fillArea = CreateUIObject("Fill Area", root); + GameObject fill = CreateUIObject("Fill", fillArea); + + // Background + Image backgroundImage = background.AddComponent(); + backgroundImage.sprite = AssetDatabase.GetBuiltinExtraResource(kBackgroundSpriteResourcePath); + backgroundImage.type = Image.Type.Sliced; + backgroundImage.color = s_DefaultSelectableColor; + RectTransform backgroundRect = background.GetComponent(); + backgroundRect.anchorMin = new Vector2(0, 0.25f); + backgroundRect.anchorMax = new Vector2(1, 0.75f); + backgroundRect.sizeDelta = new Vector2(0, 0); + + // Fill Area + RectTransform fillAreaRect = fillArea.GetComponent(); + fillAreaRect.anchorMin = new Vector2(0, 0.25f); + fillAreaRect.anchorMax = new Vector2(1, 0.75f); + fillAreaRect.anchoredPosition = Vector2.zero; + fillAreaRect.sizeDelta = Vector2.zero; + + // Fill + Image fillImage = fill.AddComponent(); + fillImage.sprite = AssetDatabase.GetBuiltinExtraResource(kStandardSpritePath); + fillImage.type = Image.Type.Sliced; + fillImage.color = s_DefaultSelectableColor; + + RectTransform fillRect = fill.GetComponent(); + fillRect.sizeDelta = Vector2.zero; + + // Setup slider component + Slider slider = root.AddComponent(); + slider.value = 0; + slider.fillRect = fill.GetComponent(); + slider.targetGraphic = fillImage; + slider.direction = Slider.Direction.LeftToRight; + SetDefaultColorTransitionValues(slider); + } + + #endregion #region Helper Functions From b1ae90757a7ef0e11380603aa5025404a28a7270 Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Thu, 26 Feb 2015 20:42:26 +0000 Subject: [PATCH 2/2] 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;