summaryrefslogtreecommitdiff
path: root/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules')
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs80
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs.meta13
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs238
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs.meta13
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs342
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs.meta13
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs623
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs.meta13
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs263
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs.meta13
10 files changed, 1611 insertions, 0 deletions
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs
new file mode 100644
index 0000000..8d22d04
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs
@@ -0,0 +1,80 @@
+namespace UnityEngine.EventSystems
+{
+
+ //c 对UnityEngine.Input进行一次简单包装,方便调试
+ // 另外如果希望自定义输入,继承这个类,并实现这些属性
+ public class BaseInput : UIBehaviour
+ {
+ public virtual string compositionString
+ {
+ get { return Input.compositionString; }
+ }
+
+ public virtual IMECompositionMode imeCompositionMode
+ {
+ get { return Input.imeCompositionMode; }
+ set { Input.imeCompositionMode = value; }
+ }
+
+ public virtual Vector2 compositionCursorPos
+ {
+ get { return Input.compositionCursorPos; }
+ set { Input.compositionCursorPos = value; }
+ }
+
+ public virtual bool mousePresent
+ {
+ get { return Input.mousePresent; }
+ }
+
+ public virtual bool GetMouseButtonDown(int button)
+ {
+ return Input.GetMouseButtonDown(button);
+ }
+
+ public virtual bool GetMouseButtonUp(int button)
+ {
+ return Input.GetMouseButtonUp(button);
+ }
+
+ public virtual bool GetMouseButton(int button)
+ {
+ return Input.GetMouseButton(button);
+ }
+
+ public virtual Vector2 mousePosition
+ {
+ get { return Input.mousePosition; }
+ }
+
+ public virtual Vector2 mouseScrollDelta
+ {
+ get { return Input.mouseScrollDelta; }
+ }
+
+ public virtual bool touchSupported
+ {
+ get { return Input.touchSupported; }
+ }
+
+ public virtual int touchCount
+ {
+ get { return Input.touchCount; }
+ }
+
+ public virtual Touch GetTouch(int index)
+ {
+ return Input.GetTouch(index);
+ }
+
+ public virtual float GetAxisRaw(string axisName)
+ {
+ return Input.GetAxisRaw(axisName);
+ }
+
+ public virtual bool GetButtonDown(string buttonName)
+ {
+ return Input.GetButtonDown(buttonName);
+ }
+ }
+}
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs.meta b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs.meta
new file mode 100644
index 0000000..57a6da5
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInput.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 6b9bc579ce1ae3148add9cf327b4ff2e
+timeCreated: 1602119378
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs
new file mode 100644
index 0000000..afb4678
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs
@@ -0,0 +1,238 @@
+using System;
+using System.Collections.Generic;
+
+namespace UnityEngine.EventSystems
+{
+ [RequireComponent(typeof(EventSystem))]
+ public abstract class BaseInputModule : UIBehaviour
+ {
+ [NonSerialized]
+ protected List<RaycastResult> m_RaycastResultCache = new List<RaycastResult>();
+
+ private AxisEventData m_AxisEventData;
+
+ private EventSystem m_EventSystem;
+ private BaseEventData m_BaseEventData;
+
+#region 输入系统
+ // 如果m_InputOverride不为空就用它,否则用默认的m_DefaultInput
+ // 如果要自己实现BaseInput,继承此类并给这个字段赋值
+ // StandaloneInputModule没有自定义,直接采用的是BaseInput
+ protected BaseInput m_InputOverride;
+ private BaseInput m_DefaultInput;
+ public BaseInput input
+ {
+ get
+ {
+ if (m_InputOverride != null)
+ return m_InputOverride;
+
+ if (m_DefaultInput == null)
+ {
+ var inputs = GetComponents<BaseInput>();
+ foreach (var baseInput in inputs)
+ {
+ // We dont want to use any classes that derrive from BaseInput for default.
+ if (baseInput != null && baseInput.GetType() == typeof(BaseInput))
+ {
+ m_DefaultInput = baseInput;
+ break;
+ }
+ }
+
+ if (m_DefaultInput == null)
+ m_DefaultInput = gameObject.AddComponent<BaseInput>();
+ }
+ return m_DefaultInput;
+ }
+ }
+#endregion
+
+ protected EventSystem eventSystem
+ {
+ get { return m_EventSystem; }
+ }
+
+ protected override void OnEnable()
+ {
+ base.OnEnable();
+ if(input != null)
+ {
+ }
+ m_EventSystem = GetComponent<EventSystem>();
+ m_EventSystem.UpdateModules(); // 把此input module加入EventSystem
+ }
+
+ protected override void OnDisable()
+ {
+ m_EventSystem.UpdateModules();// 把此input module移出EventSystem
+ base.OnDisable();
+ }
+
+ public abstract void Process();
+
+ protected static RaycastResult FindFirstRaycast(List<RaycastResult> candidates)
+ {
+ for (var i = 0; i < candidates.Count; ++i)
+ {
+ if (candidates[i].gameObject == null)
+ continue;
+
+ return candidates[i];
+ }
+ return new RaycastResult();
+ }
+
+ protected static MoveDirection DetermineMoveDirection(float x, float y)
+ {
+ return DetermineMoveDirection(x, y, 0.6f);
+ }
+
+ protected static MoveDirection DetermineMoveDirection(float x, float y, float deadZone)
+ {
+ // if vector is too small... just return
+ if (new Vector2(x, y).sqrMagnitude < deadZone * deadZone)
+ return MoveDirection.None;
+
+ if (Mathf.Abs(x) > Mathf.Abs(y))
+ {
+ if (x > 0)
+ return MoveDirection.Right;
+ return MoveDirection.Left;
+ }
+ else
+ {
+ if (y > 0)
+ return MoveDirection.Up;
+ return MoveDirection.Down;
+ }
+ }
+
+ protected static GameObject FindCommonRoot(GameObject g1, GameObject g2)
+ {
+ if (g1 == null || g2 == null)
+ return null;
+
+ var t1 = g1.transform;
+ while (t1 != null)
+ {
+ var t2 = g2.transform;
+ while (t2 != null)
+ {
+ if (t1 == t2)
+ return t1.gameObject;
+ t2 = t2.parent;
+ }
+ t1 = t1.parent;
+ }
+ return null;
+ }
+
+ // walk up the tree till a common root between the last entered and the current entered is foung
+ // send exit events up to (but not inluding) the common root. Then send enter events up to
+ // (but not including the common root).
+ protected void HandlePointerExitAndEnter(PointerEventData currentPointerData, GameObject newEnterTarget)
+ {
+ // if we have no target / pointerEnter has been deleted
+ // just send exit events to anything we are tracking
+ // then exit
+ if (newEnterTarget == null || currentPointerData.pointerEnter == null)
+ {
+ for (var i = 0; i < currentPointerData.hovered.Count; ++i)
+ ExecuteEvents.Execute(currentPointerData.hovered[i], currentPointerData, ExecuteEvents.pointerExitHandler);
+
+ currentPointerData.hovered.Clear();
+
+ if (newEnterTarget == null)
+ {
+ currentPointerData.pointerEnter = newEnterTarget;
+ return;
+ }
+ }
+
+ // if we have not changed hover target
+ if (currentPointerData.pointerEnter == newEnterTarget && newEnterTarget)
+ return;
+
+ GameObject commonRoot = FindCommonRoot(currentPointerData.pointerEnter, newEnterTarget);
+
+ // and we already an entered object from last time
+ if (currentPointerData.pointerEnter != null)
+ {
+ // send exit handler call to all elements in the chain
+ // until we reach the new target, or null!
+ Transform t = currentPointerData.pointerEnter.transform;
+
+ while (t != null)
+ {
+ // if we reach the common root break out!
+ if (commonRoot != null && commonRoot.transform == t)
+ break;
+
+ ExecuteEvents.Execute(t.gameObject, currentPointerData, ExecuteEvents.pointerExitHandler);
+ currentPointerData.hovered.Remove(t.gameObject);
+ t = t.parent;
+ }
+ }
+
+ // now issue the enter call up to but not including the common root
+ currentPointerData.pointerEnter = newEnterTarget;
+ if (newEnterTarget != null)
+ {
+ Transform t = newEnterTarget.transform;
+
+ while (t != null && t.gameObject != commonRoot)
+ {
+ ExecuteEvents.Execute(t.gameObject, currentPointerData, ExecuteEvents.pointerEnterHandler);
+ currentPointerData.hovered.Add(t.gameObject);
+ t = t.parent;
+ }
+ }
+ }
+
+ protected virtual AxisEventData GetAxisEventData(float x, float y, float moveDeadZone)
+ {
+ if (m_AxisEventData == null)
+ m_AxisEventData = new AxisEventData(eventSystem);
+
+ m_AxisEventData.Reset();
+ m_AxisEventData.moveVector = new Vector2(x, y);
+ m_AxisEventData.moveDir = DetermineMoveDirection(x, y, moveDeadZone);
+ return m_AxisEventData;
+ }
+
+ protected virtual BaseEventData GetBaseEventData()
+ {
+ if (m_BaseEventData == null)
+ m_BaseEventData = new BaseEventData(eventSystem);
+
+ m_BaseEventData.Reset();
+ return m_BaseEventData;
+ }
+
+ public virtual bool IsPointerOverGameObject(int pointerId)
+ {
+ return false;
+ }
+
+ public virtual bool ShouldActivateModule()
+ {
+ return enabled && gameObject.activeInHierarchy;
+ }
+
+ public virtual void DeactivateModule()
+ {}
+
+ public virtual void ActivateModule()
+ {}
+
+ // 模块更新入口,在这里里面调用Input检测事件
+ public virtual void UpdateModule()
+ {}
+
+ public virtual bool IsModuleSupported()
+ {
+ return true;
+ }
+ }
+}
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs.meta b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs.meta
new file mode 100644
index 0000000..5108b8b
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/BaseInputModule.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 87c800b13211f034e90e29ad88dd2d60
+timeCreated: 1602119379
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs
new file mode 100644
index 0000000..3aa8e09
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs
@@ -0,0 +1,342 @@
+using System.Collections.Generic;
+using System.Text;
+using UnityEngine.UI;
+
+namespace UnityEngine.EventSystems
+{
+
+ // 会处理触屏和鼠标
+ public abstract class PointerInputModule : BaseInputModule
+ {
+ public const int kMouseLeftId = -1;
+ public const int kMouseRightId = -2;
+ public const int kMouseMiddleId = -3;
+
+ public const int kFakeTouchesId = -4;
+
+ // 一个池子
+ protected Dictionary<int, PointerEventData> m_PointerData = new Dictionary<int, PointerEventData>();
+
+ protected bool GetPointerData(int id, out PointerEventData data, bool create)
+ {
+ if (!m_PointerData.TryGetValue(id, out data) && create) // 一个池子
+ {
+ data = new PointerEventData(eventSystem)
+ {
+ pointerId = id,
+ };
+ m_PointerData.Add(id, data);
+ return true;
+ }
+ return false;
+ }
+
+ protected void RemovePointerData(PointerEventData data)
+ {
+ m_PointerData.Remove(data.pointerId);
+ }
+
+ //c 根据touch数据得到pointEventData,并且保存raycaster结果
+ protected PointerEventData GetTouchPointerEventData(Touch input, out bool pressed, out bool released)
+ {
+ PointerEventData pointerData;
+ // 从池子里拿到存储结构,返回是否是新建结构
+ var created = GetPointerData(input.fingerId, out pointerData, true);
+
+ pointerData.Reset();
+
+ // pressed和released用来判断抬起或者放下
+
+ pressed = created || (input.phase == TouchPhase.Began); // 如果结构是新建的或input phase是bagan,说明是刚按下
+ released = (input.phase == TouchPhase.Canceled) || (input.phase == TouchPhase.Ended); // 如果phase是这两种,说明是抬起来了
+
+ if (created)//如果是新建的,记录下起始位置,否则还保留旧值,下面用来计算delta
+ pointerData.position = input.position;
+
+ if (pressed)//如果是刚按下,delta置为0
+ pointerData.delta = Vector2.zero;
+ else
+ pointerData.delta = input.position - pointerData.position; // 计算delta
+
+ pointerData.position = input.position; // 计算完delta后覆盖
+
+ pointerData.button = PointerEventData.InputButton.Left; // 这里不知道为什么
+
+ // 用这个触摸数据做射线检测,检测结果在m_RaycastResultCache
+ eventSystem.RaycastAll(pointerData, m_RaycastResultCache);
+
+ // 只取第一个,舍弃其他的
+ var raycast = FindFirstRaycast(m_RaycastResultCache);
+ Debug.Log("raycast: " + raycast.index);
+ pointerData.pointerCurrentRaycast = raycast;
+ m_RaycastResultCache.Clear();
+ return pointerData;
+ }
+
+ protected void CopyFromTo(PointerEventData @from, PointerEventData @to)
+ {
+ @to.position = @from.position;
+ @to.delta = @from.delta;
+ @to.scrollDelta = @from.scrollDelta;
+ @to.pointerCurrentRaycast = @from.pointerCurrentRaycast;
+ @to.pointerEnter = @from.pointerEnter;
+ }
+
+ protected PointerEventData.FramePressState StateForMouseButton(int buttonId)
+ {
+ var pressed = input.GetMouseButtonDown(buttonId);
+ var released = input.GetMouseButtonUp(buttonId);
+ if (pressed && released)
+ return PointerEventData.FramePressState.PressedAndReleased;
+ if (pressed)
+ return PointerEventData.FramePressState.Pressed;
+ if (released)
+ return PointerEventData.FramePressState.Released;
+ return PointerEventData.FramePressState.NotChanged;
+ }
+
+ protected class ButtonState
+ {
+ private PointerEventData.InputButton m_Button = PointerEventData.InputButton.Left;
+
+ public MouseButtonEventData eventData
+ {
+ get { return m_EventData; }
+ set { m_EventData = value; }
+ }
+
+ public PointerEventData.InputButton button
+ {
+ get { return m_Button; }
+ set { m_Button = value; }
+ }
+
+ private MouseButtonEventData m_EventData;
+ }
+
+ protected class MouseState
+ {
+ private List<ButtonState> m_TrackedButtons = new List<ButtonState>();
+
+ public bool AnyPressesThisFrame()
+ {
+ for (int i = 0; i < m_TrackedButtons.Count; i++)
+ {
+ if (m_TrackedButtons[i].eventData.PressedThisFrame())
+ return true;
+ }
+ return false;
+ }
+
+ public bool AnyReleasesThisFrame()
+ {
+ for (int i = 0; i < m_TrackedButtons.Count; i++)
+ {
+ if (m_TrackedButtons[i].eventData.ReleasedThisFrame())
+ return true;
+ }
+ return false;
+ }
+
+ public ButtonState GetButtonState(PointerEventData.InputButton button)
+ {
+ ButtonState tracked = null;
+ for (int i = 0; i < m_TrackedButtons.Count; i++)
+ {
+ if (m_TrackedButtons[i].button == button)
+ {
+ tracked = m_TrackedButtons[i];
+ break;
+ }
+ }
+
+ if (tracked == null)
+ {
+ tracked = new ButtonState { button = button, eventData = new MouseButtonEventData() };
+ m_TrackedButtons.Add(tracked);
+ }
+ return tracked;
+ }
+
+ public void SetButtonState(PointerEventData.InputButton button, PointerEventData.FramePressState stateForMouseButton, PointerEventData data)
+ {
+ var toModify = GetButtonState(button);
+ toModify.eventData.buttonState = stateForMouseButton;
+ toModify.eventData.buttonData = data;
+ }
+ }
+
+ public class MouseButtonEventData
+ {
+ public PointerEventData.FramePressState buttonState;
+ public PointerEventData buttonData;
+
+ public bool PressedThisFrame()
+ {
+ return buttonState == PointerEventData.FramePressState.Pressed || buttonState == PointerEventData.FramePressState.PressedAndReleased;
+ }
+
+ public bool ReleasedThisFrame()
+ {
+ return buttonState == PointerEventData.FramePressState.Released || buttonState == PointerEventData.FramePressState.PressedAndReleased;
+ }
+ }
+
+ private readonly MouseState m_MouseState = new MouseState();
+
+ protected virtual MouseState GetMousePointerEventData()
+ {
+ return GetMousePointerEventData(0);
+ }
+
+ protected virtual MouseState GetMousePointerEventData(int id)
+ {
+ // Populate the left button...
+ PointerEventData leftData;
+ var created = GetPointerData(kMouseLeftId, out leftData, true);
+
+ leftData.Reset();
+
+ if (created)
+ leftData.position = input.mousePosition;
+
+ Vector2 pos = input.mousePosition;
+ if (Cursor.lockState == CursorLockMode.Locked)
+ {
+ // We don't want to do ANY cursor-based interaction when the mouse is locked
+ leftData.position = new Vector2(-1.0f, -1.0f);
+ leftData.delta = Vector2.zero;
+ }
+ else
+ {
+ leftData.delta = pos - leftData.position;
+ leftData.position = pos;
+ }
+ leftData.scrollDelta = input.mouseScrollDelta;
+ leftData.button = PointerEventData.InputButton.Left;
+ eventSystem.RaycastAll(leftData, m_RaycastResultCache);
+
+ // 只要第一个raycast结果
+ var raycast = FindFirstRaycast(m_RaycastResultCache);
+ leftData.pointerCurrentRaycast = raycast;
+ m_RaycastResultCache.Clear();
+
+ // copy the apropriate data into right and middle slots
+ PointerEventData rightData;
+ GetPointerData(kMouseRightId, out rightData, true);
+ CopyFromTo(leftData, rightData);
+ rightData.button = PointerEventData.InputButton.Right;
+
+ PointerEventData middleData;
+ GetPointerData(kMouseMiddleId, out middleData, true);
+ CopyFromTo(leftData, middleData);
+ middleData.button = PointerEventData.InputButton.Middle;
+
+ // 设置按键状态
+ m_MouseState.SetButtonState(PointerEventData.InputButton.Left, StateForMouseButton(0), leftData);
+ m_MouseState.SetButtonState(PointerEventData.InputButton.Right, StateForMouseButton(1), rightData);
+ m_MouseState.SetButtonState(PointerEventData.InputButton.Middle, StateForMouseButton(2), middleData);
+
+ return m_MouseState;
+ }
+
+ protected PointerEventData GetLastPointerEventData(int id)
+ {
+ PointerEventData data;
+ GetPointerData(id, out data, false);
+ return data;
+ }
+
+ private static bool ShouldStartDrag(Vector2 pressPos, Vector2 currentPos, float threshold, bool useDragThreshold)
+ {
+ if (!useDragThreshold)
+ return true;
+
+ return (pressPos - currentPos).sqrMagnitude >= threshold * threshold;
+ }
+
+ protected virtual void ProcessMove(PointerEventData pointerEvent)
+ {
+ var targetGO = (Cursor.lockState == CursorLockMode.Locked ? null : pointerEvent.pointerCurrentRaycast.gameObject);
+ HandlePointerExitAndEnter(pointerEvent, targetGO);
+ }
+
+ // 发送drag事件
+ protected virtual void ProcessDrag(PointerEventData pointerEvent)
+ {
+ if (!pointerEvent.IsPointerMoving() ||
+ Cursor.lockState == CursorLockMode.Locked ||
+ pointerEvent.pointerDrag == null)
+ return;
+
+ if (!pointerEvent.dragging
+ && ShouldStartDrag(pointerEvent.pressPosition, pointerEvent.position, eventSystem.pixelDragThreshold, pointerEvent.useDragThreshold))
+ {
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.beginDragHandler);
+ pointerEvent.dragging = true;
+ }
+
+ // Drag notification
+ if (pointerEvent.dragging)
+ {
+ // Before doing drag we should cancel any pointer down state
+ // And clear selection!
+ if (pointerEvent.pointerPress != pointerEvent.pointerDrag)
+ {
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler);
+
+ pointerEvent.eligibleForClick = false;
+ pointerEvent.pointerPress = null;
+ pointerEvent.rawPointerPress = null;
+ }
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.dragHandler);
+ }
+ }
+
+ public override bool IsPointerOverGameObject(int pointerId)
+ {
+ var lastPointer = GetLastPointerEventData(pointerId);
+ if (lastPointer != null)
+ return lastPointer.pointerEnter != null;
+ return false;
+ }
+
+ protected void ClearSelection()
+ {
+ var baseEventData = GetBaseEventData();
+
+ foreach (var pointer in m_PointerData.Values)
+ {
+ // clear all selection
+ HandlePointerExitAndEnter(pointer, null);
+ }
+
+ m_PointerData.Clear();
+ eventSystem.SetSelectedGameObject(null, baseEventData);
+ }
+
+ public override string ToString()
+ {
+ var sb = new StringBuilder("<b>Pointer Input Module of type: </b>" + GetType());
+ sb.AppendLine();
+ foreach (var pointer in m_PointerData)
+ {
+ if (pointer.Value == null)
+ continue;
+ sb.AppendLine("<B>Pointer:</b> " + pointer.Key);
+ sb.AppendLine(pointer.Value.ToString());
+ }
+ return sb.ToString();
+ }
+
+ protected void DeselectIfSelectionChanged(GameObject currentOverGo, BaseEventData pointerEvent)
+ {
+ // Selection tracking
+ var selectHandlerGO = ExecuteEvents.GetEventHandler<ISelectHandler>(currentOverGo);
+ // if we have clicked something new, deselect the old thing
+ // leave 'selection handling' up to the press event though.
+ if (selectHandlerGO != eventSystem.currentSelectedGameObject)
+ eventSystem.SetSelectedGameObject(null, pointerEvent);
+ }
+ }
+}
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs.meta b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs.meta
new file mode 100644
index 0000000..e4f85e9
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/PointerInputModule.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ca2a80b2630ad814e85c9b5d17e69cbf
+timeCreated: 1602119380
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs
new file mode 100644
index 0000000..592ea4d
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs
@@ -0,0 +1,623 @@
+/*
+ * StandaloneInputModule :
+ * PointerInputModule :
+ * BaseInputModule
+ */
+
+using System;
+using UnityEngine;
+using UnityEngine.Serialization;
+
+namespace UnityEngine.EventSystems
+{
+ [AddComponentMenu("Event/Standalone Input Module")]
+ public class StandaloneInputModule : PointerInputModule
+ {
+ private float m_PrevActionTime;
+ private Vector2 m_LastMoveVector;
+ private int m_ConsecutiveMoveCount = 0;
+
+ // 上一个鼠标位置和当前鼠标位置,每帧更新
+ private Vector2 m_LastMousePosition;
+ private Vector2 m_MousePosition;
+
+ private GameObject m_CurrentFocusedGameObject;
+
+ protected StandaloneInputModule()
+ {
+ }
+
+ [Obsolete("Mode is no longer needed on input module as it handles both mouse and keyboard simultaneously.", false)]
+ public enum InputMode
+ {
+ Mouse,
+ Buttons
+ }
+
+ [Obsolete("Mode is no longer needed on input module as it handles both mouse and keyboard simultaneously.", false)]
+ public InputMode inputMode
+ {
+ get { return InputMode.Mouse; }
+ }
+
+ [SerializeField]
+ private string m_HorizontalAxis = "Horizontal";
+
+ /// <summary>
+ /// Name of the vertical axis for movement (if axis events are used).
+ /// </summary>
+ [SerializeField]
+ private string m_VerticalAxis = "Vertical";
+
+ /// <summary>
+ /// Name of the submit button.
+ /// </summary>
+ [SerializeField]
+ private string m_SubmitButton = "Submit";
+
+ /// <summary>
+ /// Name of the submit button.
+ /// </summary>
+ [SerializeField]
+ private string m_CancelButton = "Cancel";
+
+ [SerializeField]
+ private float m_InputActionsPerSecond = 10;
+
+ [SerializeField]
+ private float m_RepeatDelay = 0.5f;
+
+ [SerializeField]
+ [FormerlySerializedAs("m_AllowActivationOnMobileDevice")]
+ private bool m_ForceModuleActive;
+
+ [Obsolete("allowActivationOnMobileDevice has been deprecated. Use forceModuleActive instead (UnityUpgradable) -> forceModuleActive")]
+ public bool allowActivationOnMobileDevice
+ {
+ get { return m_ForceModuleActive; }
+ set { m_ForceModuleActive = value; }
+ }
+
+ public bool forceModuleActive
+ {
+ get { return m_ForceModuleActive; }
+ set { m_ForceModuleActive = value; }
+ }
+
+ public float inputActionsPerSecond
+ {
+ get { return m_InputActionsPerSecond; }
+ set { m_InputActionsPerSecond = value; }
+ }
+
+ public float repeatDelay
+ {
+ get { return m_RepeatDelay; }
+ set { m_RepeatDelay = value; }
+ }
+
+ /// <summary>
+ /// Name of the horizontal axis for movement (if axis events are used).
+ /// </summary>
+ public string horizontalAxis
+ {
+ get { return m_HorizontalAxis; }
+ set { m_HorizontalAxis = value; }
+ }
+
+ /// <summary>
+ /// Name of the vertical axis for movement (if axis events are used).
+ /// </summary>
+ public string verticalAxis
+ {
+ get { return m_VerticalAxis; }
+ set { m_VerticalAxis = value; }
+ }
+
+ public string submitButton
+ {
+ get { return m_SubmitButton; }
+ set { m_SubmitButton = value; }
+ }
+
+ public string cancelButton
+ {
+ get { return m_CancelButton; }
+ set { m_CancelButton = value; }
+ }
+
+ private bool ShouldIgnoreEventsOnNoFocus()
+ {
+ switch (SystemInfo.operatingSystemFamily)
+ {
+ case OperatingSystemFamily.Windows:
+ case OperatingSystemFamily.Linux:
+ case OperatingSystemFamily.MacOSX:
+#if UNITY_EDITOR
+ if (UnityEditor.EditorApplication.isRemoteConnected)
+ return false;
+#endif
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ //c! 这里只更新鼠标位置
+ public override void UpdateModule()
+ {
+ // 如果没有获取焦点,且忽略没有焦点时的事件,返回(除非开启远程连接,否则会这样)
+ if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
+ return;
+
+ // 更新鼠标位置
+ m_LastMousePosition = m_MousePosition;
+ m_MousePosition = input.mousePosition;
+ }
+
+ public override bool IsModuleSupported()
+ {
+ return m_ForceModuleActive || input.mousePresent || input.touchSupported;
+ }
+
+ public override bool ShouldActivateModule()
+ {
+ if (!base.ShouldActivateModule())
+ return false;
+
+ var shouldActivate = m_ForceModuleActive;
+ shouldActivate |= input.GetButtonDown(m_SubmitButton);
+ shouldActivate |= input.GetButtonDown(m_CancelButton);
+ shouldActivate |= !Mathf.Approximately(input.GetAxisRaw(m_HorizontalAxis), 0.0f);
+ shouldActivate |= !Mathf.Approximately(input.GetAxisRaw(m_VerticalAxis), 0.0f);
+ shouldActivate |= (m_MousePosition - m_LastMousePosition).sqrMagnitude > 0.0f;
+ shouldActivate |= input.GetMouseButtonDown(0);
+
+ if (input.touchCount > 0)
+ shouldActivate = true;
+
+ return shouldActivate;
+ }
+
+ public override void ActivateModule()
+ {
+ if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
+ return;
+
+ base.ActivateModule();
+ m_MousePosition = input.mousePosition;
+ m_LastMousePosition = input.mousePosition;
+
+ var toSelect = eventSystem.currentSelectedGameObject;
+ if (toSelect == null)
+ toSelect = eventSystem.firstSelectedGameObject;
+
+ eventSystem.SetSelectedGameObject(toSelect, GetBaseEventData());
+ }
+
+ public override void DeactivateModule()
+ {
+ base.DeactivateModule();
+ ClearSelection();
+ }
+
+ //c! input module事件处理主入口,每帧更新
+ public override void Process()
+ {
+ // 如果没有获取焦点,不需要处理
+ if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
+ return;
+
+ //event 给选中的对象发布更新事件
+ bool usedEvent = SendUpdateEventToSelectedObject();
+
+ // 如果勾上了Send Navigation Events,发送move , submit, cancel事件
+ if (eventSystem.sendNavigationEvents)
+ {
+ if (!usedEvent)
+ usedEvent |= SendMoveEventToSelectedObject(); //event 键盘方向键移动时给eventSystem选中的对象发布IMoveHandler事件
+
+ if (!usedEvent)
+ SendSubmitEventToSelectedObject(); //event 如果按了相应按键,发布submit或者cancel事件
+ }
+
+ // 模拟触摸或鼠标输入
+ // touch needs to take precedence because of the mouse emulation layer
+ usedEvent = ProcessTouchEvents(); //event 检测屏幕触摸,PC上没有
+
+ if(!usedEvent && input.mousePresent)
+ ProcessMouseEvent(); // 处理鼠标事件
+ }
+
+ //c 触摸事件
+ private bool ProcessTouchEvents()
+ {
+ for (int i = 0; i < input.touchCount; ++i) //多点触控
+ {
+ Debug.Log("Touch");
+
+ Touch touch = input.GetTouch(i);
+
+ if (touch.type == TouchType.Indirect)
+ continue;
+
+ bool released; // 这是一个手指抬起操作
+ bool pressed; // 这是一个手指放下操作
+ //
+ PointerEventData pointer = GetTouchPointerEventData(touch, out pressed, out released); // 射线检测并保存检测结果
+
+ // 处理触摸或抬起反馈,已经准备好了被触摸的物体
+ ProcessTouchPress(pointer, pressed, released);
+
+ if (!released)
+ {
+ ProcessMove(pointer);
+ ProcessDrag(pointer);
+ }
+ else
+ RemovePointerData(pointer);
+ }
+ return input.touchCount > 0;
+ }
+
+ //c 处理触摸\抬起
+ protected void ProcessTouchPress(PointerEventData pointerEvent, bool pressed, bool released)
+ {
+ var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
+
+ // 触摸反馈
+ // PointerDown notification
+ if (pressed)
+ {
+ pointerEvent.eligibleForClick = true;
+ pointerEvent.delta = Vector2.zero;
+ pointerEvent.dragging = false;
+ pointerEvent.useDragThreshold = true;
+ pointerEvent.pressPosition = pointerEvent.position;
+ pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast;
+
+ DeselectIfSelectionChanged(currentOverGo, pointerEvent);
+
+ if (pointerEvent.pointerEnter != currentOverGo)
+ {
+ // send a pointer enter to the touched element if it isn't the one to select...
+ HandlePointerExitAndEnter(pointerEvent, currentOverGo);
+ pointerEvent.pointerEnter = currentOverGo;
+ }
+
+ //event IPointerDownHandler
+ // 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, pointerEvent, ExecuteEvents.pointerDownHandler);
+
+ // didnt find a press handler... search for a click handler
+ if (newPressed == null)
+ newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
+
+ // Debug.Log("Pressed: " + newPressed);
+
+ float time = Time.unscaledTime;
+
+ if (newPressed == pointerEvent.lastPress)
+ {
+ var diffTime = time - pointerEvent.clickTime;
+ if (diffTime < 0.3f)
+ ++pointerEvent.clickCount;
+ else
+ pointerEvent.clickCount = 1;
+
+ pointerEvent.clickTime = time;
+ }
+ else
+ {
+ pointerEvent.clickCount = 1;
+ }
+
+ pointerEvent.pointerPress = newPressed;
+ pointerEvent.rawPointerPress = currentOverGo;
+
+ pointerEvent.clickTime = time;
+
+ // Save the drag handler as well
+ pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo);
+
+ if (pointerEvent.pointerDrag != null)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
+ }
+
+ // 抬起反馈
+ // PointerUp notification
+ if (released)
+ {
+ // Debug.Log("Executing pressup on: " + pointer.pointerPress);
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, 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<IPointerClickHandler>(currentOverGo); // 从这个对象开始往上找,直到一个挂了继承了IPointerClickHandler的组件
+
+ // PointerClick and Drop events
+ if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick) //只有在pointerPress == pointerUpHandler时才会触发click事件
+ {
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler);
+ }
+ else if (pointerEvent.pointerDrag != null && pointerEvent.dragging) // 如果两者不相等,触发drop事件
+ {
+ ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler);
+ }
+
+ pointerEvent.eligibleForClick = false;
+ pointerEvent.pointerPress = null;
+ pointerEvent.rawPointerPress = null;
+
+ if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
+
+ pointerEvent.dragging = false;
+ pointerEvent.pointerDrag = null;
+
+ // send exit events as we need to simulate this on touch up on touch device
+ ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler);
+ pointerEvent.pointerEnter = null;
+ }
+ }
+
+ /// <summary>
+ /// Process submit keys.
+ /// </summary>
+ protected bool SendSubmitEventToSelectedObject()
+ {
+ if (eventSystem.currentSelectedGameObject == null)
+ return false;
+
+ // 发布submit事件或者cancel事件
+
+ var data = GetBaseEventData();
+ if (input.GetButtonDown(m_SubmitButton)) // 这里是Project>Input里面配置的
+ ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler);
+
+ if (input.GetButtonDown(m_CancelButton))
+ ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler);
+ return data.used;
+ }
+
+ private Vector2 GetRawMoveVector()
+ {
+ Vector2 move = Vector2.zero;
+ move.x = input.GetAxisRaw(m_HorizontalAxis);
+ move.y = input.GetAxisRaw(m_VerticalAxis);
+
+ if (input.GetButtonDown(m_HorizontalAxis))
+ {
+ if (move.x < 0)
+ move.x = -1f;
+ if (move.x > 0)
+ move.x = 1f;
+ }
+ if (input.GetButtonDown(m_VerticalAxis))
+ {
+ if (move.y < 0)
+ move.y = -1f;
+ if (move.y > 0)
+ move.y = 1f;
+ }
+ return move;
+ }
+
+ /// <summary>
+ /// Process keyboard events.
+ /// </summary>
+ protected bool SendMoveEventToSelectedObject()
+ {
+ float time = Time.unscaledTime;
+
+ Vector2 movement = GetRawMoveVector();
+ if (Mathf.Approximately(movement.x, 0f) && Mathf.Approximately(movement.y, 0f)) // 如果键盘方向键没动,返回
+ {
+ m_ConsecutiveMoveCount = 0;
+ return false;
+ }
+
+ //allow即是否允许发布事件
+ // If user pressed key again, always allow event
+ bool allow = input.GetButtonDown(m_HorizontalAxis) || input.GetButtonDown(m_VerticalAxis);
+ bool similarDir = (Vector2.Dot(movement, m_LastMoveVector) > 0); // 和之前的方向是否夹角在90°以内,如果是的话说明很接近
+ if (!allow)
+ {
+ // Otherwise, user held down key or axis.
+ // If direction didn't change at least 90 degrees, wait for delay before allowing consequtive event.
+ if (similarDir && m_ConsecutiveMoveCount == 1)
+ allow = (time > m_PrevActionTime + m_RepeatDelay);
+ // If direction changed at least 90 degree, or we already had the delay, repeat at repeat rate.
+ else
+ allow = (time > m_PrevActionTime + 1f / m_InputActionsPerSecond);
+ }
+ if (!allow)
+ return false;
+
+ // 发布IMoveHandler事件
+
+ // Debug.Log(m_ProcessingEvent.rawType + " axis:" + m_AllowAxisEvents + " value:" + "(" + x + "," + y + ")");
+ var axisEventData = GetAxisEventData(movement.x, movement.y, 0.6f);
+
+ if (axisEventData.moveDir != MoveDirection.None)
+ {
+ ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, axisEventData, ExecuteEvents.moveHandler); // IMoveHandler.OnMove
+ if (!similarDir)
+ m_ConsecutiveMoveCount = 0;
+ m_ConsecutiveMoveCount++;
+
+ m_PrevActionTime = time;
+ m_LastMoveVector = movement;
+ }
+ else
+ {
+ m_ConsecutiveMoveCount = 0;
+ }
+
+ return axisEventData.used;
+ }
+
+ protected void ProcessMouseEvent()
+ {
+ ProcessMouseEvent(0);
+ }
+
+ [Obsolete("This method is no longer checked, overriding it with return true does nothing!")]
+ protected virtual bool ForceAutoSelect()
+ {
+ return false;
+ }
+
+ /// <summary>
+ /// Process all mouse events.
+ /// </summary>
+ protected void ProcessMouseEvent(int id)
+ {
+ var mouseData = GetMousePointerEventData(id);
+ var leftButtonData = mouseData.GetButtonState(PointerEventData.InputButton.Left).eventData;
+
+ m_CurrentFocusedGameObject = leftButtonData.buttonData.pointerCurrentRaycast.gameObject;
+
+ // Process the first mouse button fully
+ ProcessMousePress(leftButtonData);
+ ProcessMove(leftButtonData.buttonData);
+ ProcessDrag(leftButtonData.buttonData);
+
+ // Now process right / middle clicks
+ ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData);
+ ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Right).eventData.buttonData);
+ ProcessMousePress(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData);
+ ProcessDrag(mouseData.GetButtonState(PointerEventData.InputButton.Middle).eventData.buttonData);
+
+ if (!Mathf.Approximately(leftButtonData.buttonData.scrollDelta.sqrMagnitude, 0.0f))
+ {
+ var scrollHandler = ExecuteEvents.GetEventHandler<IScrollHandler>(leftButtonData.buttonData.pointerCurrentRaycast.gameObject);
+ ExecuteEvents.ExecuteHierarchy(scrollHandler, leftButtonData.buttonData, ExecuteEvents.scrollHandler);
+ }
+ }
+
+ // 每帧发送一个OnUpdateSelected事件
+ protected bool SendUpdateEventToSelectedObject()
+ {
+ if (eventSystem.currentSelectedGameObject == null)
+ return false;
+
+ var data = GetBaseEventData();
+ //event 向eventSystem当前选中的gameobject发布一个更新事件IUpdateSelectedHandler,比如inputfield
+ ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler);
+ return data.used;
+ }
+
+ // 处理鼠标按下事件,发送消息,调用回调
+ /// <summary>
+ /// Process the current mouse press.
+ /// </summary>
+ protected void ProcessMousePress(MouseButtonEventData data)
+ {
+ var pointerEvent = data.buttonData;
+ var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
+
+ // PointerDown notification
+ if (data.PressedThisFrame())
+ {
+ pointerEvent.eligibleForClick = true;
+ pointerEvent.delta = Vector2.zero;
+ pointerEvent.dragging = false;
+ pointerEvent.useDragThreshold = true;
+ pointerEvent.pressPosition = pointerEvent.position;
+ pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast;
+
+ DeselectIfSelectionChanged(currentOverGo, pointerEvent);
+
+ // 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, pointerEvent, ExecuteEvents.pointerDownHandler);
+
+ // didnt find a press handler... search for a click handler
+ if (newPressed == null)
+ newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
+
+ // Debug.Log("Pressed: " + newPressed);
+
+ float time = Time.unscaledTime;
+
+ if (newPressed == pointerEvent.lastPress)
+ {
+ var diffTime = time - pointerEvent.clickTime;
+ if (diffTime < 0.3f)
+ ++pointerEvent.clickCount;
+ else
+ pointerEvent.clickCount = 1;
+
+ pointerEvent.clickTime = time;
+ }
+ else
+ {
+ pointerEvent.clickCount = 1;
+ }
+
+ pointerEvent.pointerPress = newPressed;
+ pointerEvent.rawPointerPress = currentOverGo;
+
+ pointerEvent.clickTime = time;
+
+ // Save the drag handler as well
+ pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo);
+
+ if (pointerEvent.pointerDrag != null)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
+ }
+
+ // PointerUp notification
+ if (data.ReleasedThisFrame())
+ {
+ // Debug.Log("Executing pressup on: " + pointer.pointerPress);
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, 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<IPointerClickHandler>(currentOverGo);
+
+ // PointerClick and Drop events
+ if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick)
+ {
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler);
+ }
+ else if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
+ {
+ ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler);
+ }
+
+ pointerEvent.eligibleForClick = false;
+ pointerEvent.pointerPress = null;
+ pointerEvent.rawPointerPress = null;
+
+ if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
+
+ pointerEvent.dragging = false;
+ pointerEvent.pointerDrag = null;
+
+ // redo pointer enter / exit to refresh state
+ // so that if we moused over somethign that ignored it before
+ // due to having pressed on something else
+ // it now gets it.
+ if (currentOverGo != pointerEvent.pointerEnter)
+ {
+ HandlePointerExitAndEnter(pointerEvent, null);
+ HandlePointerExitAndEnter(pointerEvent, currentOverGo);
+ }
+ }
+ }
+
+ protected GameObject GetCurrentFocusedGameObject()
+ {
+ return m_CurrentFocusedGameObject;
+ }
+ }
+}
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs.meta b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs.meta
new file mode 100644
index 0000000..dde31b7
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/StandaloneInputModule.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: e2665fa6a1fb2474d8a5c19f72f8d0c6
+timeCreated: 1602119380
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs
new file mode 100644
index 0000000..58ac97c
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs
@@ -0,0 +1,263 @@
+using System;
+using System.Text;
+using UnityEngine.Serialization;
+
+namespace UnityEngine.EventSystems
+{
+ //c TouchInputModule被废弃了,统一在standaloneInputModule中处理
+ [Obsolete("TouchInputModule is no longer required as Touch input is now handled in StandaloneInputModule.")]
+ [AddComponentMenu("Event/Touch Input Module")]
+ public class TouchInputModule : PointerInputModule
+ {
+ protected TouchInputModule()
+ {}
+
+ // 触摸点位置
+ private Vector2 m_LastMousePosition;
+ private Vector2 m_MousePosition;
+
+ [SerializeField]
+ [FormerlySerializedAs("m_AllowActivationOnStandalone")]
+ private bool m_ForceModuleActive;
+
+ [Obsolete("allowActivationOnStandalone has been deprecated. Use forceModuleActive instead (UnityUpgradable) -> forceModuleActive")]
+ public bool allowActivationOnStandalone
+ {
+ get { return m_ForceModuleActive; }
+ set { m_ForceModuleActive = value; }
+ }
+
+ public bool forceModuleActive
+ {
+ get { return m_ForceModuleActive; }
+ set { m_ForceModuleActive = value; }
+ }
+
+ //c 更新鼠标(触摸点)位置
+ public override void UpdateModule()
+ {
+ m_LastMousePosition = m_MousePosition;
+ m_MousePosition = input.mousePosition;
+ }
+
+ public override bool IsModuleSupported()
+ {
+ return forceModuleActive || input.touchSupported;
+ }
+
+ public override bool ShouldActivateModule()
+ {
+ if (!base.ShouldActivateModule())
+ return false;
+
+ if (m_ForceModuleActive)
+ return true;
+
+ if (UseFakeInput())
+ {
+ bool wantsEnable = input.GetMouseButtonDown(0);
+
+ wantsEnable |= (m_MousePosition - m_LastMousePosition).sqrMagnitude > 0.0f;
+ return wantsEnable;
+ }
+
+ if (input.touchCount > 0)
+ return true;
+
+ return false;
+ }
+
+ private bool UseFakeInput()
+ {
+ return !input.touchSupported;
+ }
+
+ public override void Process()
+ {
+ if (UseFakeInput())
+ FakeTouches();
+ else
+ ProcessTouchEvents();
+ }
+
+ /// <summary>
+ /// For debugging touch-based devices using the mouse.
+ /// </summary>
+ private void FakeTouches()
+ {
+ var pointerData = GetMousePointerEventData(0);
+
+ var leftPressData = pointerData.GetButtonState(PointerEventData.InputButton.Left).eventData;
+
+ // fake touches... on press clear delta
+ if (leftPressData.PressedThisFrame())
+ leftPressData.buttonData.delta = Vector2.zero;
+
+ ProcessTouchPress(leftPressData.buttonData, leftPressData.PressedThisFrame(), leftPressData.ReleasedThisFrame());
+
+ // only process move if we are pressed...
+ if (input.GetMouseButton(0))
+ {
+ ProcessMove(leftPressData.buttonData);
+ ProcessDrag(leftPressData.buttonData);
+ }
+ }
+
+ /// <summary>
+ /// Process all touch events.
+ /// </summary>
+ private void ProcessTouchEvents()
+ {
+ for (int i = 0; i < input.touchCount; ++i)
+ {
+ Touch touch = input.GetTouch(i);
+
+ if (touch.type == TouchType.Indirect)
+ continue;
+
+ bool released;
+ bool pressed;
+ var pointer = GetTouchPointerEventData(touch, out pressed, out released);
+
+ ProcessTouchPress(pointer, pressed, released);
+
+ if (!released)
+ {
+ ProcessMove(pointer);
+ ProcessDrag(pointer);
+ }
+ else
+ RemovePointerData(pointer);
+ }
+ }
+
+ protected void ProcessTouchPress(PointerEventData pointerEvent, bool pressed, bool released)
+ {
+ var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
+
+ // PointerDown notification
+ if (pressed)
+ {
+ pointerEvent.eligibleForClick = true;
+ pointerEvent.delta = Vector2.zero;
+ pointerEvent.dragging = false;
+ pointerEvent.useDragThreshold = true;
+ pointerEvent.pressPosition = pointerEvent.position;
+ pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast;
+
+ DeselectIfSelectionChanged(currentOverGo, pointerEvent);
+
+ if (pointerEvent.pointerEnter != currentOverGo)
+ {
+ // send a pointer enter to the touched element if it isn't the one to select...
+ HandlePointerExitAndEnter(pointerEvent, currentOverGo);
+ pointerEvent.pointerEnter = currentOverGo;
+ }
+
+ // 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, pointerEvent, ExecuteEvents.pointerDownHandler);
+
+ // didnt find a press handler... search for a click handler
+ if (newPressed == null)
+ newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
+
+ // Debug.Log("Pressed: " + newPressed);
+
+ float time = Time.unscaledTime;
+
+ if (newPressed == pointerEvent.lastPress)
+ {
+ var diffTime = time - pointerEvent.clickTime;
+ if (diffTime < 0.3f)
+ ++pointerEvent.clickCount;
+ else
+ pointerEvent.clickCount = 1;
+
+ pointerEvent.clickTime = time;
+ }
+ else
+ {
+ pointerEvent.clickCount = 1;
+ }
+
+ pointerEvent.pointerPress = newPressed;
+ pointerEvent.rawPointerPress = currentOverGo;
+
+ pointerEvent.clickTime = time;
+
+ // Save the drag handler as well
+ pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo);
+
+ if (pointerEvent.pointerDrag != null)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
+ }
+
+ // PointerUp notification
+ if (released)
+ {
+ // Debug.Log("Executing pressup on: " + pointer.pointerPress);
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, 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<IPointerClickHandler>(currentOverGo);
+
+ // PointerClick and Drop events
+ if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick)
+ {
+ ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler);
+ }
+ else if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
+ {
+ ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler);
+ }
+
+ pointerEvent.eligibleForClick = false;
+ pointerEvent.pointerPress = null;
+ pointerEvent.rawPointerPress = null;
+
+ if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
+
+ pointerEvent.dragging = false;
+ pointerEvent.pointerDrag = null;
+
+ if (pointerEvent.pointerDrag != null)
+ ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
+
+ pointerEvent.pointerDrag = null;
+
+ // send exit events as we need to simulate this on touch up on touch device
+ ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler);
+ pointerEvent.pointerEnter = null;
+ }
+ }
+
+ public override void DeactivateModule()
+ {
+ base.DeactivateModule();
+ ClearSelection();
+ }
+
+ public override string ToString()
+ {
+ var sb = new StringBuilder();
+ sb.AppendLine(UseFakeInput() ? "Input: Faked" : "Input: Touch");
+ if (UseFakeInput())
+ {
+ var pointerData = GetLastPointerEventData(kMouseLeftId);
+ if (pointerData != null)
+ sb.AppendLine(pointerData.ToString());
+ }
+ else
+ {
+ foreach (var pointerEventData in m_PointerData)
+ sb.AppendLine(pointerEventData.ToString());
+ }
+ return sb.ToString();
+ }
+ }
+}
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs.meta b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs.meta
new file mode 100644
index 0000000..facfc33
--- /dev/null
+++ b/Assets/uGUI-2017.1/UnityEngine.UI/EventSystem/InputModules/TouchInputModule.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 27cc0457fb3bcbe4eb6038275fbdde36
+timeCreated: 1602119378
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: