使用版本是3.8.5.
以前老版本可以单独对物体某一个轴维度设置tween,比如我需要一个物体向前移动,使用tween控制,同时物体的垂直方向受物理影响(掉坑或者飞天等)。
印象大概代码是
tween(this.node.position)
.to(2, { x: { value: 200 } }) .start();
这样tween控制的X轴移动就跟其他轴向的变换不冲突.
后来版本更新了,只能针对node.postion整体来做tween缓动,猜测可能是因为Vector是一个object,而某个轴的数值是数字不是object。
这样会引发一系列问题,比如我现在有这样一个需求,通过tween控制角色水平移动,垂直方向受到重力和物理影响,只能采用非常绕的方式,角色向下掉落正常,水平移动正常代码如下:
let myNode = this.node;
let outVal = {val:0}; let lastLerp = 0; tween(outVal).to(2, { val: { value: 100, progress(start: number, end: number, current: number, ratio: number): number { const delta = ratio - lastLerp; lastLerp = ratio; myNode.position = v3(myNode.position.x - delta * 200, myNode.position.y, myNode.position.z); console.log('cc',ratio); return lerp(start, end, ratio); } } }).start();
如果直接使用tweenTo,会导致垂直方向上,物理几乎失效,如果角色在空中,只会略微向下移动一点距离。
start() {
tween(this.node) .to(2, { position: { value: v3(-200, 0, 0) } }) .start(); }
如果直接使用tweenBy,垂直方向上会有较大幅度向下移动
start() {
tween(this.node) .by(2, { position: { value: v3(-200, 0, 0) } }) .start(); }
个人对tween的理解是,使用to,就需要目标对象在规定时间到的时候,抵达要求的状态,中间无论tween的progress还是tween的Update,影响对象实现过程.
使用tween.By,会在时间规定到的时候,给目标实现状态增量变化,至于在过程和结果时,目标本身是否发生了哪些变化,和tween的增量变化应该是独立的,互相不干涉. 比如我在其他地方要求2秒内node上升高度100,使用tween使2秒内高度下降100,那2秒结束后,node的位置应该没有发生变化,上升100和下降100抵消了,而实际上by似乎是转为了当前值+by值=最终值,tween.to(最终值)来实现的逻辑,实现一个最终状态,而不是实现增量.
这样tween使用的时候,独立性更强,tween对一个object的影响,和其他代码对object的影响,是一个先后作用关系,而不是覆盖关系.
testTween_3.8.5.zip (52.5 KB)