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

Unity中如何向DoTween的OnComplete传递动画启动时的变量参数

解决DoTween OnComplete捕获变量值的问题

你遇到的是C#闭包的引用捕获特性导致的问题:lambda表达式捕获的是变量的引用,而非动画启动时的具体值。当动画执行完成触发OnComplete时,val已经被自增到1,所以输出的是最新值而非初始的0。

下面是几种可行的解决方法:

方法1:创建局部临时变量保存初始值

在定义lambda前,把当前val的值存到一个临时变量中,让lambda捕获这个不会被后续修改的副本:

int val = 0;
Debug.Log("Value = " + val); // 输出0

// 用临时变量保存动画启动时的val值
int initialVal = val;
transform.DOScaleY(2.0f, 1.0f).OnComplete(() =>
{
     Debug.Log("Value = " + initialVal); // 输出0,符合需求
});
val++;

方法2:使用DoTween带参数的OnComplete重载

DoTween提供了支持参数传递的OnComplete重载,可以直接把动画启动时的值绑定到回调上:

int val = 0;
Debug.Log("Value = " + val);

// 直接传入当前val的值作为回调参数
transform.DOScaleY(2.0f, 1.0f).OnComplete((currentVal) =>
{
     Debug.Log("Value = " + currentVal); // 输出0
}, val);
val++;

方法3:封装独立回调方法传递参数

把回调逻辑拆成独立方法,调用时直接传入当前val的值,避免闭包的引用捕获:

int val = 0;
Debug.Log("Value = " + val);

// 调用独立方法时传入当前val的值
transform.DOScaleY(2.0f, 1.0f).OnComplete(() => LogInitialValue(val));
val++;

// 独立的回调方法
void LogInitialValue(int value)
{
    Debug.Log("Value = " + value); // 输出0
}

原理说明

以上方法的核心都是固定住动画启动时的变量值:要么通过临时变量保存不可变的副本,要么直接把值作为参数传递给回调,避免lambda捕获变量的引用,从而确保OnComplete触发时拿到的是动画启动时的初始值。

内容的提问来源于stack exchange,提问作者Laurent Crivello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:16:08