// 更新事件组碰撞数据 ( 鼠标与触屏共用 )
        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;
        }