/// <summary> /// 删除所有的数据 /// </summary> /// <param name="isDeleteShowingItems">=true 标示立刻删除所有的项,=false 则标示显示完之后再删除</param> public virtual void ClearAllContentItem(bool isDeleteShowingItems) { RececlyMessageItems(); mAllContentInfors.Clear(); mAllShowingContentMessageItem.Clear(); mAllRecycleMessage.Clear(); mWillShowContent = null; mLastShowContenItem = null; }
protected virtual UILanternMessageItem GetMeessageItem() { GameObject go = UIObjectPoolManager.Instance.GetObjectFromPool(mContentPrefab.name); go.transform.SetParent(mViewMaskRectTrans, false); UILanternMessageItem viewItem = go.GetAddComponentEx <UILanternMessageItem>(); viewItem.rectTransform.pivot = viewItem.rectTransform.anchorMax = viewItem.rectTransform.anchorMin = new Vector2(0, 0.5f); return(viewItem); }
protected virtual void RececlyMessageItems() { while (mAllShowingContentMessageItem.Count != 0) { UILanternMessageItem item = mAllShowingContentMessageItem.Dequeue(); if (item != null) { Rect itemRect = item.rectTransform.GetCanvasRect_Standard(mCanvas); if (itemRect.x + itemRect.width > mViewMaskRect.x + mViewMaskRect.width) { //Debug.Log("需要重新播放 " + item.mInforData.mContentMessage); mAllRecycleMessage.Add(item.mInforData); } //说明消息没哟显示完则缓存然后插入队列中 DeleteMeessageItem(item, false); if (OnCompleteTweenCallback != null) { OnCompleteTweenCallback(item); } } } if (mAllRecycleMessage.Count != 0) { mAllContentInfors.InsertRange(0, mAllRecycleMessage); mAllRecycleMessage.Clear(); } if (mViewMaskRectTrans.childCount > 0) { int count = mViewMaskRectTrans.childCount; for (int dex = 0; dex < count; dex++) { var target = mViewMaskRectTrans.GetChild(0).GetComponent <UILanternMessageItem>(); DeleteMeessageItem(target, false); } } //确保数据都被删除了 mLastShowContenItem = null; mAllShowingContentMessageItem.Clear(); }
//protected virtual void OnCompleteTween() //{ // if (mAllShowingContentMessageItem.Count == 0) // return; // var viewItem = mAllShowingContentMessageItem.Dequeue(); // Rect viewTargetRect = viewItem.rectTransform.GetCanvasRect(mCanvas); // Rect mViewMaskRect = mViewMaskRectTrans.GetCanvasRect(mCanvas); // if (mViewMaskRect.Overlaps(viewTargetRect) == false) // { // // Debug.Log("OnCompleteLastTween Recycle " + viewItem.gameObject.name); // DeleteMeessageItem(viewItem, true); // } // if (OnCompleteTweenCallback != null) // OnCompleteTweenCallback(viewItem); //} #endregion #region 辅助接口 protected virtual void DeleteMeessageItem(UILanternMessageItem item, bool isAutoCompleteOrKill) { if (item.mContentShowTweener != null && item.mContentShowTweener.IsComplete() == false) { if (isAutoCompleteOrKill) { item.mContentShowTweener.Complete(); } else { item.mContentShowTweener.Kill(); } item.mContentShowTweener = null; } if (mLastShowContenItem == item) { mLastShowContenItem = null; } UIObjectPoolManager.Instance.ReturnObjectToPool(item.gameObject); }
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); }