cocos creator 3.8.3 tween 执行 scale 缩放后,Node的width、height 变成了原来的10倍大小

TestTweenScale.rar (3.5 MB) 描述如下:
加载bundle里的一个预制体,instantiate一个节点后添加一个脚本,然后执行脚本里的一个回调,回调函数里执行tween scale动画,节点的原始大小是1280x720,tween执行完后发现节点的大小变成了12800x7200。


局部截取_20241202_105126

局部截取_20241202_103720

  • Creator 版本: cocos creator 3.8.3

  • 目标平台: 谷歌浏览器 版本 109.0.5414.120 32 位 、cocos creator 内置模拟器

  • 重现方式:直接运行demo查看日志或者在内置模拟器下查看testUI节点的UITransform的大小

  • 重现概率:100%

1赞

需要把0.1的缩放一起放入tween,才不会影响UITrasnsform的大小

那样的话界面会闪一下啊

不对啊 调缩放 不会影响size啊

会不会是加了什么widget之类的导致改变大小的时候被拉伸了,毕竟刚load出来就去执行scale之类的脚本就去修改scale,那个时候可能还没走widget哦

这。。。不知道算不算bug
延迟一帧后正常:
image
image

不太清楚,反正让我碰到了

理论上是,但是我就是碰到了,不知道为啥

延迟一帧界面不会闪一下吗?

根节点上加widget了,但是那会有影响吗

你添加完脚本组件之后立即执行了缩放动画,而 Widget 的对齐会在下一帧执行,所以实际上的过程是这样的:

  1. 节点缩放到0.1倍
  2. Widget 执行对齐 (这里尺寸就变成了 10倍,是因为你设置了全屏拉伸,所以 Widget 根据 scale 拉伸了尺寸【最终尺寸=当前尺寸/当前缩放系数】,所以现在尺寸是原来的 10倍)
  3. tween 动画更新 (尺寸就不再变化了,一直是原来的10倍)

正确的做法是延迟一帧再执行动画;或者手动调用 widget.updateAlignment(); 之后再清除对齐组件的脏标记 widget._dirty = false; 然后再执行动画。

这跟 tween 没有关系。
是 testUi 这个 prefab 的根节点配置的 cc.Widget 有问题。不应该配置成拉伸全屏。
因为配置为拉升全屏后,设置 scale 为 0.1,拉伸的操作会要求 testUi 的节点的 contentSize 保持跟父节点一致,那么引擎底层会做 width / 0.1 的操作,即将 testUi 的节点 contentSize 放大 10 倍来配合其 contentSize 始终保持跟父节点的大小一致。

我假定你只是想做一个 testUi prefab 节点的从小到大的放大操作。可以配置其 widget 居中对齐,然后初始化 testUi component 的时候,手动设置其 contentSize 为其父节点的大小。

import { _decorator, Component, find, Node, tween, UITransform, v3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('testUi')
export class testUi extends Component {

    openAnim():void{
        const block = this.node;
        const uiTransform = this.node.getComponent(UITransform);
        uiTransform.contentSize = find('Canvas').getComponent(UITransform).contentSize;

        block.scale = v3(0.1, 0.1, 0.1);
        console.log('before tween size==>',block.getComponent(UITransform).contentSize)
        tween(block).to(1,{scale:v3(1,1,1)}, {
            onUpdate: (target, ratio) => {
                console.log('tween size==>',block.getComponent(UITransform).contentSize)
            },
        }).call(()=>{
            console.log('after tween size==>',block.getComponent(UITransform).contentSize)
        }).start();
    }
}

修改后的工程:
TestTweenScale-fixed.zip (33.0 KB)

多谢多谢 :heart:

多谢回复, :heart: