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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:18:00