You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中在Start()方法内调用DOTween UI动画出现卡顿的问题求助

Unity中在Start()方法内调用DOTween UI动画出现卡顿的问题求助

大家好,我最近在Unity项目里遇到了一个头疼的问题,想请教一下各位前辈:

我写了两个类,一个是负责触发UI动画的MonoBehaviour类,另一个是封装了DOTween动画工具方法的非MonoBehaviour类。当我在Start()方法里调用UI的缩放动画时,动画会出现明显的卡顿(不流畅、有跳帧感),但如果等游戏完全启动后再触发这个动画(比如通过按钮点击手动调用),动画就播放得非常顺滑。

先贴一下我的代码:

负责触发动画的MonoBehaviour类

using DG.Tweening;
using UnityEngine;

public class WindowStartAnimation : MonoBehaviour
{
    [SerializeField] private GameObject _window;
    private UIAnimation _UIAnimation;
    [SerializeField] private float _animDuration = 1f;

    private void Start()
    {
        _UIAnimation = new();
        _UIAnimation.UIScale(_window, new Vector3(0.4f, 0.4f), Vector3.one, _animDuration, Ease.OutBack, false);
    }
}

DOTween动画工具类

using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class UIAnimation
{
    public void UIScale(GameObject obj, Vector3 start, Vector3 end, float time = 0.6f, Ease ease = Ease.OutBack, bool isUpdate = true)
    {
        obj.transform.localScale = start;
        obj.transform.DOScale(end, time).SetEase(ease, overshoot: 1.2f).SetLink(obj).SetUpdate(isUpdate);
    }

    // 其他移动相关的方法...
}

我自己排查后猜测,可能是因为Start()方法执行时,UI的布局系统(Layout System)还在进行更新,导致目标RectTransform的状态不稳定,进而影响了动画的流畅度。

为了解决这个问题,我尝试了几种方案:

  • Start()改成异步方法,用C#原生的async/await等待一帧再执行动画
  • 使用UniTask的await UniTask.Yield()来延迟动画执行
  • 把动画代码直接写到MonoBehaviour类里,去掉工具类的封装

但不管用哪种方式,只要是在Start()阶段触发的动画,还是会出现卡顿的情况,实在不知道该怎么解决了,求各位大佬支支招!

内容来源于stack exchange

火山引擎 最新活动