【3.8.4 已发布】3.8.4 Tween 功能增强版试用(可直接拷贝到现有工程中试用)

这个 3.8.5 可能来不及了,还有其它的更紧急的任务需要处理。

嗯,这个我后续考虑看看。大概率不会在 3.8.5 了。

女子白勺。

有这个,你就可以实现类似的 springs 效果了。我 PR 中提交了一个粗超的 springs 版本的 demo 。

1赞

太棒,最后一块拼图也补全了,如果不设计为同名的重载方法,是否应将 update 给无限时间 api,而有限时间 api 再想其它的名字,比如 updateInTime 之类的。

我对 updateUntil 这个名字倒是比较满意的,字面意思就知道,这个更新是 一直更新直到 回调函数返回 true。

TS 的重载其实是个伪重载,其重载实现还是要通过判断参数类型去 if else 逻辑处理,用重载的话都是 update ,而回调函数类型参数与返回值又不同,会在一定程度上影响理解。因此,我不赞同有限时间 update 和不确定时间 update 都叫 update 这个名字。

其实有限时间的 update,应该叫 updateInDuration 会比 updateInTime 好点。但是既然我们已经有 updateUntil ,那么有限时间就叫 update 也问题不大。

1赞

虽然我更倾向于 update 保留给无限时间 api,因为更符合使用惯性,比如组件的生命周期函数的名字也是 update,而有限时间 api 的名字则只要取得不是太难懂就好。

但是 updateUntil 也不是不能接受,挺好的。

嗯,主要是这个无限时间的 update 他的 callback 还需要有个返回值,这跟组件和 scheduler 的 update 回调定义格格不入,而我们又取名如果也叫 update,难免会有一些概念上的混淆,不够清晰。

之前用这种方法实现的数值滚动,现在怎么不能使用了,我刚升级的3.8.4版本,请问是怎么回事呢?

什么错误?
之前.d.ts中没有声明value这种用法,不报错吗?

没有报错,我换onUpdate功能平替了

tween可以把 每帧的dt暴露出来吗,在低帧率的情况下,每帧跳跃就非常大,看上去就不连贯,如果把dt暴露出来并且可以返回自定义的dt时间,这样在低帧的情况下,将dt的值修改小一点,动作看上去就会是连贯的

node的透明度,旋转,颜色,位移能不能搞一个tween里面处理,有没有test case可以看看

这个现在是在3.8.4里面了吗?

可以尝试自定义 TweenSystem 来实现:

import { _decorator, Component, director, TweenSystem, System } from 'cc';
const { ccclass, property } = _decorator;


class FixedTimeTweenSystem extends TweenSystem {
    update(dt: number): void {
        // 这里你可以自定义 dt 的值
        super.update(0.016 * 4);
    }
}

let isTweenSystemReplaced = false;

function useFixedTimeTweenSystem() {
    if (isTweenSystemReplaced) return;
    const tweenSystem = director.getSystem(TweenSystem.ID)!;
    director.unregisterSystem(tweenSystem);
    const fixedTimeTweenSystem = new FixedTimeTweenSystem();
    (TweenSystem as any).instance = fixedTimeTweenSystem;
    director.registerSystem(TweenSystem.ID, fixedTimeTweenSystem, System.Priority.MEDIUM);
    isTweenSystemReplaced = true;
}

@ccclass('TweenSystemFixedTime')
export class TweenSystemFixedTime extends Component {
    start() {
        useFixedTimeTweenSystem();
    }

    update(deltaTime: number) {
        
    }
}

1赞

在 3.8.4 中。

这个因为 node 上不带透明度、颜色属性,导致不能写成一个 tween。

不过新版本 parallel 子 tween 支持不同的 target。写法大概是这样:

import { _decorator, Color, color, Component, Node, Sprite, tween, v3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('MyTweenTest')
export class MyTweenTest extends Component {
    start() {
        tween(this.node)
            .parallel(
                tween(this.node).by(2, { position: v3(0, 100, 0), angle: 60 }),
                tween(this.getComponent(Sprite)!).to(2, { color: new Color(255, 0, 0, 50) })
            )
            .start();
    }


}

1赞

有个问题, 现在项目用的3.8.2, 但是有一个功能很需要3.8.4的tween.pause和resume。 我也能直接修改tween文件夹并修改引用吗

直接把tween目录下的代码替换过去应该就可以

直接替换3.8.2引擎里面的tween然后重新编译引擎吗,但是好像没有api提示, 已经export D.ts了。

实际 使用是生效的, 但是没得提示 得加// @ts-ignore 使用 :rofl: