DOTween中同一对象动画被中断时,应使用何种替代OnComplete的回调?
解决DOTween动画中断时OnComplete不执行的问题
嘿,我之前做项目时刚好碰到过一模一样的情况!你的问题根源很明确:当快速点击按钮触发新的DOFade动画时,旧的动画会被DOTween自动终止(Kill),而OnComplete()回调只会在动画完整播放到结束时才触发,中途被打断自然不会执行。
针对这个场景,给你两个实用的解决方案:
方案1:结合OnComplete()和OnKill()回调
把静音逻辑同时绑定到这两个回调上,这样不管动画是正常播放完毕,还是中途被中断销毁,都能触发静音操作:
MusicBox.musicAudioSource.DOFade(0.0f, 1.0f) .OnComplete(() => { MusicBox.musicAudioSource.mute = true; }) .OnKill(() => { MusicBox.musicAudioSource.mute = true; });
这里不用担心重复执行静音——就算动画正常完成时OnComplete和OnKill会先后触发,多次调用mute = true也不会有任何副作用。
方案2:手动管理动画状态(更可控)
如果需要更精细的状态控制,可以先禁用动画的自动销毁,每次触发新操作前先清理旧动画并检查当前状态:
// 先终止并销毁之前的动画 MusicBox.musicAudioSource.DOKill(); // 检查当前音量是否已经接近0,是则直接静音 if (Mathf.Approximately(MusicBox.musicAudioSource.volume, 0.0f)) { MusicBox.musicAudioSource.mute = true; } else { // 启动新的淡入淡出动画,完成后静音 MusicBox.musicAudioSource.DOFade(0.0f, 1.0f) .SetAutoKill(false) .OnComplete(() => { MusicBox.musicAudioSource.mute = true; }); }
这种方式能避免一些意外的状态冲突,适合复杂的音频管理场景。
小提示
如果你的需求只是“让音量淡到0后静音,中途被打断也直接静音”,那OnKill()其实是最直接的选择——任何导致动画终止的操作(被新动画覆盖、手动销毁、对象被移除等)都会触发这个回调。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

