Unity缩放脚本修复:自动/手动切换逻辑异常问题
修复Unity物体自动缩放循环卡顿问题
问题根源
错误脚本中,当isAutomatic为true时,Update函数每帧都会调用Fade()方法,导致:
- 每帧切换
scaleUp状态,缩放方向反复颠倒 - 频繁停止当前执行的缩放协程,重新启动新协程
- 缩放动画被持续打断,无法完成一次完整的缩放循环,最终卡在中途
修复方案
- 自动模式下,仅当当前无正在执行的缩放协程时,才触发下一次缩放切换
- 在缩放协程完成后,自动模式下主动触发下一次循环缩放
- 手动触发(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
相关产品推荐
相关产品推荐

