// 更新事件组碰撞数据 ( 鼠标与触屏共用 ) private static void UpdateListenerGroupHitData(PointerData pointerData, PointerStatusData statusData) { int nowHitsCount = statusData.NowHits.Length; int groupCount = ListenerGroups.Count; for (int i = 0; i < groupCount; i++) { if (ListenerGroups[i].Target != null) { for (int j = 0; j < nowHitsCount; j++) { if (ListenerGroups[i].Target == statusData.NowHits[j].collider.gameObject) { // 判断是否要派发 Cover 事件并更新碰撞数据 bool dispatchCover = false; if (pointerData.InputType == PointerInputType.Mouse) { dispatchCover = ListenerGroups[i].MouseRaycastHit.point != statusData.NowHits[j].point; pointerData.PointerID = -1; ListenerGroups[i].MouseRaycastHit = statusData.NowHits[j]; } else if (pointerData.InputType == PointerInputType.Touch) { dispatchCover = ListenerGroups[i].TouchRaycastHits[pointerData.PointerID].point != statusData.NowHits[j].point; ListenerGroups[i].TouchRaycastHits[pointerData.PointerID] = statusData.NowHits[j]; } // 派发 Cover 事件 if (dispatchCover) { pointerData.EventType = PointerEventType.Cover; ListenerGroups[i].DispatchAll(pointerData, ListenerGroups[i].Target == statusData.NowFocus, false); } break; } } // 派发 Drag 事件 int dragCount = ListenerGroups[i].DragStatus.Count; for (int j = 0; j < dragCount; j++) { if (ListenerGroups[i].DragStatus[j].PrevX != pointerData.X || ListenerGroups[i].DragStatus[j].PrevY != pointerData.Y) { ListenerGroups[i].DragStatus[j].PrevX = pointerData.X; ListenerGroups[i].DragStatus[j].PrevY = pointerData.Y; pointerData.PointerID = ListenerGroups[i].DragStatus[j].PointerID; pointerData.EventType = PointerEventType.Drag; ListenerGroups[i].DispatchAll(pointerData, ListenerGroups[i].DragStatus[j].BeginDragHasFocus, false); } } } } }
// 判断滑入滑出事件 ( 鼠标与触屏共用 ) private static void CheckEnterAndExit(PointerData pointerData, PointerStatusData statusData) { PointerListenerGroupForMesh group; int nowHitsCount = statusData.NowHits.Length; int prevHitsCount = statusData.PrevHits.Length; // 判断滑入 bool enter = false; for (int i = 0; i < nowHitsCount; i++) { enter = true; for (int j = 0; j < prevHitsCount; j++) { if (statusData.NowHits[i].collider == statusData.PrevHits[j].collider) { enter = false; break; } } if (enter) { group = FindGroupByGameObject(statusData.NowHits[i].collider.gameObject); if (group != null) { // 派发 Enter 事件 pointerData.EventType = PointerEventType.Enter; group.DispatchAll(pointerData, group.Target == statusData.NowFocus, false); } } } // 判断滑出 bool exit = false; for (int i = 0; i < prevHitsCount; i++) { exit = true; for (int j = 0; j < nowHitsCount; j++) { if (statusData.PrevHits[i].collider == statusData.NowHits[j].collider) { exit = false; break; } } if (exit) { if (statusData.PrevHits[i].collider != null) // 上一帧数据可能被释放,需要 null 判断 { group = FindGroupByGameObject(statusData.PrevHits[i].collider.gameObject); if (group != null) { // 派发 Exit 事件 pointerData.EventType = PointerEventType.Exit; group.DispatchAll(pointerData, group.Target == statusData.PrevFocus, false); } } } } // 判断因焦点改变而产生的滑入和滑出事件 if (!enter && !exit && statusData.PrevFocus != statusData.NowFocus) { group = FindGroupByGameObject(statusData.NowFocus); if (group != null) { // 派发 Enter 事件 pointerData.EventType = PointerEventType.Enter; group.DispatchAll(pointerData, true, true); } group = FindGroupByGameObject(statusData.PrevFocus); if (group != null) { // 派发 Exit 事件 pointerData.EventType = PointerEventType.Exit; group.DispatchAll(pointerData, true, true); } } // 缓存当前帧数据 statusData.PrevHits = statusData.NowHits; statusData.PrevFocus = statusData.NowFocus; }