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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:50:40