///<summary> /// Process all mouse events. /// 处理所有的鼠标事件 ///</summary> protectedvoidProcessMouseEvent(int id) { // 通过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); } }
///<summary> /// Calculate and process any mouse button /// state changes. /// 处理鼠标按下事件 ///</summary> protectedvoidProcessMousePress(MouseButtonEventData data) { var pointerEvent = data.buttonData; var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
// 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;
// Save the drag handler as well // 保存拖曳信息 pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo); // 执行拖曳启动事件句柄 if (pointerEvent.pointerDrag != null) ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
// redo pointer enter / exit to refresh state // so that if we moused over something 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); }
///<summary> /// Process the drag for the current frame with the given pointer event. ///</summary> protectedvirtualvoidProcessDrag(PointerEventData pointerEvent) { if (!pointerEvent.IsPointerMoving() || Cursor.lockState == CursorLockMode.Locked || pointerEvent.pointerDrag == null) return;
// 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);
///<summary> /// Process movement for the current frame with the given pointer event. ///</summary> protectedvirtualvoidProcessMove(PointerEventData pointerEvent) { var targetGO = (Cursor.lockState == CursorLockMode.Locked ? null : pointerEvent.pointerCurrentRaycast.gameObject); HandlePointerExitAndEnter(pointerEvent, targetGO); }
///<summary> /// Process all touch events. /// 处理所有触屏事件 ///</summary> privatevoidProcessTouchEvents() { 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); } }
///<summary> /// Execute the specified event on the first game object underneath the current touch. ///</summary> privatestaticreadonlyList<Transform> s_InternalTransformList = new List<Transform>(30);
publicstatic GameObject ExecuteHierarchy<T>(GameObject root, BaseEventData eventData, EventFunction<T> callbackFunction) where T : IEventSystemHandler { // 获取物体的所有父节点,包括它自己。 GetEventChain(root, s_InternalTransformList);
for (var i = 0; i < s_InternalTransformList.Count; i++) { var transform = s_InternalTransformList[i]; // 对每个父节点包括自己依次执行句柄响应 if (Execute(transform.gameObject, eventData, callbackFunction)) return transform.gameObject; } returnnull; }
///<summary> /// Perform a raycast into the screen and collect all graphics underneath it. /// 在屏幕上进行射线碰撞,并收集所有元素 ///</summary> [NonSerialized] staticreadonlyList<Graphic> s_SortedGraphics = new List<Graphic>(); privatestaticvoidRaycast(Canvas canvas, Camera eventCamera, Vector2 pointerPosition, IList<Graphic> foundGraphics, List<Graphic> results) { // Necessary for the event system // 事件系统所必须的 int totalCount = foundGraphics.Count; for (int i = 0; i < totalCount; ++i) { Graphic graphic = foundGraphics[i];
// -1 means it hasn't been processed by the canvas, which means it isn't actually drawn // -1表示画布尚未对其进行处理,这意味着它实际上并未绘制 if (graphic.depth == -1 || !graphic.raycastTarget || graphic.canvasRenderer.cull) continue;
if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, pointerPosition, eventCamera)) continue;
if (eventCamera != null && eventCamera.WorldToScreenPoint(graphic.rectTransform.position).z > eventCamera.farClipPlane) continue;
if (graphic.Raycast(pointerPosition, eventCamera)) { s_SortedGraphics.Add(graphic); } }
s_SortedGraphics.Sort((g1, g2) => g2.depth.CompareTo(g1.depth)); totalCount = s_SortedGraphics.Count; for (int i = 0; i < totalCount; ++i) results.Add(s_SortedGraphics[i]);