给引擎方报一个3.8.4的严重bug,脚本不支持动态挂载

1、创建一个脚本Move.Ts,用来控制物体的移动,如果是手动拖脚本挂载到场景节点上,控制物体移动是没问题的。

2、如果不是手动挂载,而是创建一个脚本Main.ts,然后Main.ts里通过addCompnent(Move)挂载Move脚本到节点,这时移动物体的渲染就会出现bug,移动过程中看不到物体渲染,直到停止移动后,物体才会在停止的终点位置被渲染出来,也就是移动时,只会在起始点和停止的终点会被渲染,移动的效果就是一闪一闪的。

如果之前的3.8.4以下的项目如果用到addCompnent挂脚本并升级到3.8.4的同学要注意这个bug

@minggo

这么基础的东西也会出问题啊,不应该吧 :sweat_smile:
能不能上传个demo看下啊

按我上面第二个步骤操作

先用sprite创建一个图标。然后创建一个Move可以通过方向键控制上下左右移动的脚本。

分别测试一下,手动拖脚本到节点和通过代码addComponent到节点的情况。

用creator3.8.4版测

测试了一下没出现问题,你看下哪里不一样
test.zip (699.8 KB)

TestPrj3.8.4.zip (9.5 KB)
看看这个案例

代码不复杂,就是让节点移动,移动到x轴300的位置就停止

没运行前是这样的,x轴大概在-500的位置

运行后,节点通过update移动,移动到300的位置,发现图标的渲染还没刷新,还是原来-500的位置

对节点操作一次显示隐藏,渲染才会更新

其实就是Component的Update函数没有更新渲染,只更新了逻辑坐标。

我开始提那个addComponent是判断失误,不是这个问题引起。

发现问题所在了,是position的的逻辑在3.8.4被改了


像截图里需要对position进行clone()一次才可以。
不能对position本身做对象重新赋值,无论

this.node.position = pos;
还是
this.node.position.setPosition(pos.x,pos.y,pos.z),都无法刷新渲染,只能更新逻辑位置。

这个和之前的这个朋友发的贴子是同一个问题。

这个问题很严重,很多旧版本项目升级到3.8.4肯定出问题

@ ListenLee

看我上面发的信息,希望能快点修正这个只更新位置不刷新渲染的bug。不然很多项目都无法升级到3.8.4

看看置顶帖
[3.8.4 升级必读]:Node 的一些 set 接口行为的修正

看我的代码。
没有做close这个移动是不刷新渲染的

这个有close的移动是可以刷新移动

数值方面,都是相等的。所以按理说setPosition应该是否用克隆对象都是没问题的才对

这种写法也是无法刷新渲染的

image

你们加这种限制会导致很多旧项目都跑不起来,新人用3.8.4开放新项目也会遇到很多坑,连最基本的设置位置都那么困难,会吓退新人。

其实官方接口通过this.node.postion返回的是Readonly vec3本意是不能修改的,如果这样let pos = this.node.position类型自动推断后面去修改pos肯定报错,但是用户用Vec3注解强转了变成了一个普通的Vec3只能说js太随心所欲了

我不是官方的人哈,找到问题了就好

:laughing: 精彩文章。

我已经养成clone的习惯了

帖子里面写的很清楚,改了相关的set接口了,如果值相同,会直接返回,不会触发相应的回调和刷新。

正确的做法应该是:

//准备一个缓存变量
private _worldPos = v3();

this.node.getWorldPosition(this._worldPos);
this._worldPos.x = 10;

this.node.setWorldPosition(this._worldPos); //或者 this.node.worldPosition = this._worldPos;

又或者:

let worldPos = this.node.worldPosition;
this.node.setWorldPosition(worldPos.x + 10, worldPos.y, worldPos.z);

很久之前position的返回从v2变为v3后, 就只用getPosition/setPosition了.
自从cc.p系列函数被废弃后, cc.v2/cc.v3/cc.color也不敢用了, 全用new

官方的人跟你说不用clone呢?

我是AI,所以我要克隆
大家一起来克隆吧~