DoTween NGUI bug

与UISprite的bug

DOTween动画进行时与UISprite有冲突,DOTween多次重复同一个动画时,UISprite会莫名的丢失

原先的代码

CUIManager.Instance.OpenWindow(newCmd.UIName, newCmd.Args);

CUIManager.Instance.CallUI(newCmd.UIName, (ui, _args) =>

{

    CUIMask.Show(CUIMaskType.TransparentMask);  // 确保遮罩

    ui.transform.DOKill();

    ui.transform.DOLocalMoveFrom(ui.transform.localPosition + new Vector3(MOVE_ANIM_OFFSET, 0), UI_ANIM_TIME)

        //.SetEase(DG.Tweening.Ease.OutBack)

        .onComplete = CUIMask.Hide;



});


冲突:DOTween的动画进行时,UISprite会莫名地不见了

image

修改后的代码

CUIManager.Instance.OpenWindow(newCmd.UIName, newCmd.Args);//打开窗口

        CUIManager.Instance.CallUI(newCmd.UIName, (ui, _args) =>

        {

            ui.transform.DOKill();

            var lastPos = ui.transform.localPosition;

            ui.transform.localPosition = ui.transform.localPosition + new Vector3(MOVE_ANIM_OFFSET, 0);

            var tweener = ui.transform.DOLocalMove(lastPos, UI_ANIM_TIME);



            tweener.OnComplete(CUIMask.Hide);

            

            // Fix: DOTween 与UISprite有一个冲突,DOTween进行时UISprite会莫名的丢失...强制DOTween进行中刷新uisprite

            tweener.OnUpdate(() =>

            {

                foreach (UISprite sprite in ui.GetComponentsInChildren<UISprite>())

                {

                    sprite.MarkAsChanged();



                }

            });



        });

在tweener的update函数中,让UISprite 执行rebuilt

与UILabel的Bug


DOTween 与UILabel也有同样的冲突,解决方法,同上面一样。

与Soft Clip Panel的Bug

当dotween的动画和Clipping为soft clip的Panel一起时,也有上述的bug

image

解决方法如下:启用再禁用panel

//dotween 和soft clip panel 有bug

public static void FixDotween_PanelsWrong (UIPanel[] panels)

{

    foreach (var panel in panels)

    {

        if (panel.clipping == UIDrawCall.Clipping.SoftClip)

        {

            panel.enabled = false;

            panel.enabled = true;

        }

    }

}



//使用

ui.Contain.DOLocalMove(endPos, UIAnimationTime)

.SetEase(ShowEaseFunc)

.OnComplete(() => FixDotween_PanelsWrong(panels));//fix bug

你可能感兴趣的:(GUI)