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;