You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Unity协程实现的溶解淡入动画帧率无关?

Unity溶解淡入动画帧率无关修正方案

问题根源

当前代码使用了每帧固定比例的Lerp(0.22f),帧率越高每秒执行的Lerp次数越多,动画推进速度越快;帧率越低执行次数越少,速度就越慢。同时elapsed仅作为循环终止条件,没有真正用来控制动画的时间进度,导致动画时长完全依赖帧率。

修正后的代码

public IEnumerator DissolveIn()
{
    // 定义动画总时长(单位:秒),可根据需求调整
    float totalDuration = 1f;
    float elapsed = 0f;

    // 提前获取所有子物体的材质引用,避免每帧重复查找
    List<Material> materials = new List<Material>();
    for (int i = 0; i < 7; i++)
    {
        SpriteRenderer renderer = transform.GetChild(i).GetComponent<SpriteRenderer>();
        if (renderer != null)
        {
            materials.Add(renderer.material);
        }
    }

    // 获取初始_Fade值(若各材质初始值不同,可单独存储每个的初始值)
    float startFade = materials[0].GetFloat("_Fade");
    float targetFade = 1f;

    while (elapsed < totalDuration)
    {
        elapsed += Time.deltaTime;
        // 计算0~1的时间进度值,完全与帧率无关
        float progress = Mathf.Clamp01(elapsed / totalDuration);
        // 根据进度线性插值得到当前_Fade值
        float currentFade = Mathf.Lerp(startFade, targetFade, progress);

        foreach (Material mat in materials)
        {
            mat.SetFloat("_Fade", currentFade);
        }

        yield return null;
    }

    // 确保动画结束时_Fade准确设置为目标值
    foreach (Material mat in materials)
    {
        mat.SetFloat("_Fade", targetFade);
    }
}

关键改动说明

  • 固定动画时长:通过totalDuration明确动画总时长,无论帧率波动,动画都会在指定时间内完成。
  • 时间驱动的进度计算:用elapsed / totalDuration得到0到1的进度值,该值仅由时间决定,与帧率无关。
  • 预加载材质引用:避免每帧重复调用GetChild和GetComponent,减少性能开销。
  • 全局线性插值:从初始值到目标值做整体线性过渡,替代原每帧固定比例的局部Lerp,保证动画节奏稳定。

内容的提问来源于stack exchange,提问作者G-han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:35:18