1、创建一个脚本Move.Ts,用来控制物体的移动,如果是手动拖脚本挂载到场景节点上,控制物体移动是没问题的。
2、如果不是手动挂载,而是创建一个脚本Main.ts,然后Main.ts里通过addCompnent(Move)挂载Move脚本到节点,这时移动物体的渲染就会出现bug,移动过程中看不到物体渲染,直到停止移动后,物体才会在停止的终点位置被渲染出来,也就是移动时,只会在起始点和停止的终点会被渲染,移动的效果就是一闪一闪的。
如果之前的3.8.4以下的项目如果用到addCompnent挂脚本并升级到3.8.4的同学要注意这个bug
@minggo
这么基础的东西也会出问题啊,不应该吧 能不能上传个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被改了
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应该是否用克隆对象都是没问题的才对
这种写法也是无法刷新渲染的
你们加这种限制会导致很多旧项目都跑不起来,新人用3.8.4开放新项目也会遇到很多坑,连最基本的设置位置都那么困难,会吓退新人。
其实官方接口通过this.node.postion返回的是Readonly vec3本意是不能修改的,如果这样let pos = this.node.position类型自动推断后面去修改pos肯定报错,但是用户用Vec3注解强转了变成了一个普通的Vec3只能说js太随心所欲了
我不是官方的人哈,找到问题了就好
精彩文章。
我已经养成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,所以我要克隆 大家一起来克隆吧~