tween和其他位移系统冲突解决方案以及改进建议.

使用版本是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)

1赞

是的,现在的 tween 系统的属性更新都是相对起始记录的值做差值增量计算的。

tween.by 的确是需要有你说的相对当前值做增量更新,而不是起始值。

在 cocos2d-x 和 creator 2.x 的 action 里面叫做 stackable action。

之前有建了一个 issue:

后续会完善。

期待后续更新,tween是越来越完善了.