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

Unity缩放脚本修复:自动/手动切换逻辑异常问题

修复Unity物体自动缩放循环卡顿问题

问题根源

错误脚本中,当isAutomatic为true时,Update函数每帧都会调用Fade()方法,导致:

  • 每帧切换scaleUp状态,缩放方向反复颠倒
  • 频繁停止当前执行的缩放协程,重新启动新协程
  • 缩放动画被持续打断,无法完成一次完整的缩放循环,最终卡在中途

修复方案

  1. 自动模式下,仅当当前无正在执行的缩放协程时,才触发下一次缩放切换
  2. 在缩放协程完成后,自动模式下主动触发下一次循环缩放
  3. 手动触发(G键)保留随时打断当前动画切换状态的逻辑

修复后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fader : MonoBehaviour
{
    public GameObject objectToScale;
    public float duration = 1f;
    public Vector3 minSize;
    public Vector3 maxSize;
    public bool scaleUp = false;
    public Coroutine scaleCoroutine;
    public bool isAutomatic = false;

    private void Start()
    {
        objectToScale.transform.localScale = minSize;
        // 自动模式下启动第一次缩放
        if (isAutomatic)
        {
            StartNextScale();
        }
    }

    private void Update()
    {
        // 手动触发:按下G键切换缩放状态,可打断当前动画
        if (Input.GetKeyDown(KeyCode.G))
        {
            ToggleScale();
        }
    }

    // 切换缩放状态并启动对应协程
    private void ToggleScale()
    {
        scaleUp = !scaleUp;
        StartNextScale();
    }

    // 启动下一次缩放协程(先停止当前正在执行的)
    private void StartNextScale()
    {
        if (scaleCoroutine != null)
        {
            StopCoroutine(scaleCoroutine);
        }

        scaleCoroutine = StartCoroutine(ScaleOverTime(
            objectToScale, 
            scaleUp ? maxSize : minSize, 
            duration
        ));
    }

    private IEnumerator ScaleOverTime(GameObject targetObj, Vector3 toScale, float duration)
    {
        float counter = 0;
        Vector3 startScaleSize = targetObj.transform.localScale;

        while (counter < duration)
        {
            counter += Time.deltaTime;
            targetObj.transform.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);
            yield return null;
        }

        // 确保最终缩放精确到目标值
        targetObj.transform.localScale = toScale;

        // 自动模式下,当前缩放完成后触发下一次循环
        if (isAutomatic)
        {
            scaleUp = !scaleUp;
            StartNextScale();
        }
    }
}

关键修改说明

  • 将自动缩放的触发逻辑从Update移到协程完成后,避免每帧调用打断动画
  • 拆分ToggleScale和StartNextScale方法,职责更清晰
  • 协程结束后强制设置目标缩放值,避免Lerp精度问题
  • 自动模式下,每次缩放完成后自动切换方向并启动下一次缩放,形成循环

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:45:41