如何在Unity中实现9 slice缩放动画并修复现有代码运行异常问题
Unity 9切片SpriteRenderer缩放动画异常修复方案
原代码异常原因
- 循环终止逻辑错误:两个for循环的终止条件写的是
1 != XToSize,和X、Y轴的实际缩放进度完全无关,循环逻辑彻底紊乱 - 帧同步逻辑混乱:第一个循环等物理帧
WaitForFixedUpdate,第二个等渲染帧WaitForEndOfFrame,两种等待间隔不固定,导致缩放速度忽快忽慢 - 阈值判断时机错误:第一个循环判断用的是修改size之前的i值,修改size之后没有即时判断,导致size超过阈值后才触发修正,出现回弹效果
- Y轴循环的变量逻辑错误:第二个调整Y轴的循环,循环变量依然取的是X轴的size值,完全没有判断Y轴的进度,逻辑错位
修复后代码
// speed单位为 单位/秒,不受设备帧率影响,速度稳定 public IEnumerator BarSize(float speed , float XToSize, float YToSize) { // 第一步:先调整X轴到目标大小 while (Sprite.size.x < XToSize) { // Time.deltaTime为上一帧到当前帧的时间差,乘以速度保证每秒缩放增量固定 Sprite.size += new Vector2(speed * Time.deltaTime, 0); // 避免超出目标值,超过后直接锁定为目标值 if (Sprite.size.x >= XToSize) { Sprite.size = new Vector2(XToSize, Sprite.size.y); } // 等待下一渲染帧,和画面刷新同步 yield return null; } // 第二步:X轴调整完成后,再调整Y轴到目标大小 while (Sprite.size.y < YToSize) { Sprite.size += new Vector2(0, speed * Time.deltaTime); if (Sprite.size.y >= YToSize) { Sprite.size = new Vector2(Sprite.size.x, YToSize); } yield return null; } }
新手使用注意
- 调用协程时需要用
StartCoroutine(BarSize(速度值, 目标X轴大小, 目标Y轴大小));的写法 - 速度值可以根据需求调整,例如设为3的话,对应轴每秒会增加3个单位的大小
- 如果需要X、Y轴同时缩放,直接把两个轴的增量写在同一个while循环里即可
- 要提前确认对应Sprite已经开启9切片配置,否则缩放时边缘会出现拉伸变形
内容的提问来源于stack exchange,提问作者JESTA
相关产品推荐
相关产品推荐

