如何使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
相关产品推荐
相关产品推荐

