protected virtual bool DoLoopShowContent() { if (mViewMaskRectTrans.childCount >= mMaxShowingItemCount) { return(false); } mWillShowContent = GetNextShowContentItem(); if (mWillShowContent == null) { return(false); } mAllContentInfors.RemoveAt(0); UILanternMessageItem tempLastMessageItem = mLastShowContenItem; //使用临时变量避免修改原有的引用 // EditorPauseApplication.Pause(); if (tempLastMessageItem == null && mViewMaskRectTrans.childCount > 0) { tempLastMessageItem = mViewMaskRectTrans.GetChild(mViewMaskRectTrans.childCount - 1).GetComponent <UILanternMessageItem>(); } float endAnchorPos = 0, tweenTime = 0; UILanternMessageItem viewItem = GetMeessageItem(); viewItem.ShowContent(mWillShowContent); if (tempLastMessageItem != null) { Rect LastShowTargetRect = tempLastMessageItem.rectTransform.GetCanvasRect_Standard(mCanvas); if (LastShowTargetRect.x + LastShowTargetRect.width >= mViewMaskRect.x + mViewMaskRect.width - mContentItemSpace) //这里-mContentItemSpace 为了确保两个项之间的距离最小是mContentItemSpace { // Debug.Log("上一个记录很长 超过Mask区域 则下一个消息接在这个消息后面 " + mLastShowContenItem.rectTransform.anchoredPosition.x); viewItem.rectTransform.anchoredPosition = new Vector2(tempLastMessageItem.rectTransform.anchoredPosition.x + tempLastMessageItem.rectTransform.rect.width + mContentItemSpace, 0); } //上一个记录很长 超过Mask区域 则下一个消息接在这个消息后面 else { viewItem.rectTransform.anchoredPosition = new Vector2(mViewMaskRectTrans.rect.width, 0); } //在显示区域的右边开始 } else { viewItem.rectTransform.anchoredPosition = new Vector2(mViewMaskRectTrans.rect.width, 0); } endAnchorPos = -1 * viewItem.mWidth - mContentItemSpace; //防止边界问题 每个消息多位移一点点 mLastShowContenItem = viewItem; tweenTime = mBaseTweenTime * Mathf.Abs(endAnchorPos - viewItem.rectTransform.anchoredPosition.x) / mBaseTweenDistance; Tweener tween = viewItem.rectTransform.DOAnchorPosX(endAnchorPos, tweenTime).SetEase(Ease.Linear).OnComplete(() => { Rect viewTargetRect = viewItem.rectTransform.GetCanvasRect_Standard(mCanvas); Rect mViewMaskRect = mViewMaskRectTrans.GetCanvasRect_Standard(mCanvas); if (mViewMaskRect.Overlaps(viewTargetRect) == false) { // Debug.Log("OnCompleteLastTween Recycle " + viewItem.gameObject.name); if (mAllShowingContentMessageItem.Count > 0) { if (mAllShowingContentMessageItem.Peek() != viewItem) { Debug.Log("保存的数据记录与存在的不对应 "); //当调用了ClearAllContentItem 接口后,由于没有删除已经存在的消息 这里可能不一致 } else { mAllShowingContentMessageItem.Dequeue(); } } DeleteMeessageItem(viewItem, true); } if (OnCompleteTweenCallback != null) { OnCompleteTweenCallback(viewItem); } }); viewItem.SetTweener(tween); mAllShowingContentMessageItem.Enqueue(viewItem); return(true); }