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
相关产品推荐
相关产品推荐

