(Tween 综合讨论) 关于 3.8.4 Tween 系统的类型改进

这个想法挺好,我测试了一下,这样也不破坏之前 tween() ,Tween 这种默认的没有 target 类型的使用方法了。 :+1:

看你这个回复,感觉你没认真看我这个贴想表达的是什么。

1赞

感谢反馈,这里应该是因为 tween 无法级联不同的 target 类型导致的问题。我想想有没有好的方法。

没有改接口,这贴只是加强类型,优化开发体验。

1赞

把原始帖发一下,我排查一下。感觉歪楼了啊。

这个要是改了会方便很多,希望能优化 :pray:

这个是说编辑器环境下和运行时环境行为上不一致吗?能否结合代码片段详细说明一下?

1赞

某些小丑,看帖子能不能认真看完,再回复。
这个改进影响的是严格模式下的类型检测,
不是tm改了接口的参数导致你原来的代码不能运行

1赞

我了个乖乖,都3.8.5了

这个我也苦恼中,经常漏消息。 :joy:

1赞

给tween加几个专用的属性字段怎么样?
tween(this.node).to(1,{size:cc.v2(50,100),anchor:cc.v2(0.5,0.5),position:cc.v3(0,0)}).start();
这样node和uiTransform的属性可以写一起
tween内部把size和anchor分别对应到UITransform的contentSize和anchor就行了

这样太 hack 了吧,不太赞同这种做法。

舍不得孩子套不着狼啊 :thinking:

1赞

这个建议,已经合并进 PR: https://github.com/cocos/cocos-engine/pull/16948/commits/97b8497b0ce853defffb423f174f5542e64a4e03

现在并不会破坏之前的空 target 类型 tween({}), tween() 的用法了。感谢。

我用如下代码验证了一下:

class Animal {
    public a = 0;
}

class Dog extends Animal {
    public b = 0;
}

        let animal = new Animal();
        let dog = new Dog();

        animal = dog; // OK,dog 继承于 animal,包含 animal 上的所有属性,因此可以赋值
        dog = animal; // 报错,animal 并不能赋值给 dog,animial 上缺失 dog 的属性。Property 'b' is missing in type 'Animal' but required in type 'Dog'.ts(2741)

同理,Tween 无法赋值给 Tween 的,即你上述第一个例子,会报 Type ‘Animal’ is not assignable to type ‘Dog’.ts(2322)

            let t1: Tween<Animal> = tween(animal);
            let t2: Tween<Dog> = tween(dog);
            t2 = t1; // Type 'Animal' is not assignable to type 'Dog'.ts(2322)

            t2.target(dog);

我之所以说这个太 hack,是因为你只考虑到 UITransform 的情况,那么如果其它 N 种组件(引擎内部和用户自己的组件)要怎么办?

之前未考虑到 tween 的某些函数其实是可以读取到 target 的:

tween.to({ b: 0 });

那第一种情况确实其实应该报错,但注意第二种情况也应该要报错,因为现在 tween 对 target 既能读也能写。

            let t1: Tween<Animal> = tween(animal);
            let t2: Tween<Dog> = tween(dog);

            t2 = t1; // Type 'Animal' is not assignable to type 'Dog'.ts(2322)

            t1 = t2; // should error there.

            t1.target(animal); // because animal no 'b' property.

tween 无法级联不同的 target 类型
这个优化也会放到3.8.5里面吗???
尽快解决吧。。。
现在写起来实在是太蛋疼了。。。 :joy:

引擎内部和用户自己的组件,target本来就不应该是node而是组件对象啊
对了,还可以把color也添加成特殊属性字段
这是保持tween和2.x的一致性,不是一个tween支持多target

tween的speed为什么不暴露出来, 大家肯定会有变速的需求

2赞