• 缓动系统
    • 简单示例
    • 注意事项
      • API 差异
      • 特殊机制产生的差异

    缓动系统

    为了更友好和高效的开发,并且保持 Cocos Creator 2D 缓动系统的使用体验,Cocos Creator 3D 在 tween.js 的基础上封装了一层类似于 Cocos Creator 2D 的缓动系统的 API 使用方式,并且未来将兼容 tween.js 的使用方式(目前暂未开放)。

    简单示例

    1. import { _decorator, Component, Vec3, tween } from "cc";
    2. @ccclass("tween-test")
    3. export class tweentest extends Component {
    4. private _pos: Vec3 = new Vec3(0, 0, 0);
    5. start () {
    6. Vec3.copy(this._pos, this.node.position);
    7. tweenUtil(this._pos)
    8. .to(3, new Vec3(10, 10, 10), { easing: 'Bounce-InOut' })
    9. .to(3, new Vec3(0, 0, 0), { easing: 'Elastic-Out' })
    10. .union()
    11. .repeat(1)
    12. .start();
    13. }
    14. update (deltaTime: number) {
    15. this.node.position = this._pos;
    16. }
    17. }

    注意事项

    API 差异

    由于底层的实现不同,以及 3D 与 2D 的差异较大,所以目前 API 上存在以下区别:

    • tween 方法改名为了 tweenUtil。
    • repeat 方法语义为重复几次,即repeat(1) 代表重复一次,执行两次,在 2D 中语义为执行次数,即执行一次。
    • repeat 方法多次调用为重写,在 2D 中是累加。
    • repeat 方法中暂不支持插入缓动,后面会考虑支持。
    • 暂不支持对单个属性进行 easing 、progress 等
    • easing 的可选值有变化,并且形式与 2D 的不同。
    • progress 用 easing 代替,可以输入自定义函数到 easing 参数。
    • 部分 API 暂不支持:clone 、 removeSelf 、 reverseTime 、 sequnence 、 target 、 then 。
    • 部分 API 尚不稳定,行为与 2D 可能有所出入。

    特殊机制产生的差异

    Cocos Creator 3D 中 Node 的 dirty 机制

    为了降低更新 Node Transform 信息的频率,Node 内部维护了一个 dirty 状态,只有在调用了可能会改变 Node Transform 信息的接口,才会将 dirty 置为需要更新的状态。

    但是目前的接口存在一定的局限性,例如:通过 this.node.position 获取到的 position 是一个通用的 Vec3,当执行this.node.position.x = 1这段代码的时候,只执行 Node position 的 getter,并没有执行postion 的 setter,由于 dirty 并没有更新,就会导致渲染时使用的节点的 Transform 信息没有更新。

    目前,我们也不支持这样的调用,而是鼓励使用 setPostion 这样的接口,或者通过 position 的 setter,即以下代码方式:

    1. let _pos = new Vec3(0, 1, 0);
    2. this.node.position = _pos; // 这里将通过 position 的 setter
    3. this.node.setPosition(_pos); // 这里将通过接口 setPosition

    因此,缓动系统目前暂不支持直接为 Node Transform 相关的数据进行插值,后续变化请留意更新公告。注:简单示例中介绍了如何通过缓动系统改变 Node 的 Transform