DoTween NGUI bug

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/4047535.html



多次动画导致UISprite丢失#

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

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

UISPrite解决办法#

复制代码
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丢失#

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

多次动画导致UIPanel(Soft Clip)内容丢失#

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

image

UIPanel解决方法#

启用再禁用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
作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(2043)  评论(4编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
CONTENTS
点击右上角即可分享
微信分享提示