Пример #1
0
 /// <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;
 }
Пример #2
0
    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);
    }
Пример #3
0
    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();
    }
Пример #4
0
    //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);
    }
Пример #5
0
    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);
    }