关于node节点的Position赋值问题

惯例,先说结论
ccc3d里面的Position赋值现在有两种
1.

Node.setPosition( vec3 );

不像ccc2d的时候方便,因为position.x|y|z都变为了只读属性

第一种的setPosition我觉得没啥问题,毕竟是直接设置Positon整体。
但是第二种Node.position.set();
他的传参是(x?,y?,z?);
这就有点蛋疼=- =。

毕竟按照说明和原本用意(个人揣测,错了别喷),应该是可以只修改其中的一个或多个值,既然如此应该传参格式传入一个obj的
{
x?,
y?,
z?
}
多好,哪里需要点哪里,soeasy对吧。。。现在就突然感觉很别扭,我只想修改个z的值,却必须传入x,y的值,这就有点多此一举的感觉。

就提个使用意见,引擎组当时这么设置的原因肯定有引擎组的想法,我就合理吐个槽,不喜勿喷:joy:

同感,scale也是,必须把x,y,z都填进去才行

人工置顶,让引擎组关注我:joy:

this.node.x = 10 这样不是设置一个参数吗

this.node.scaleX 也是可以的呢

3D里this.node里没有x
只有this.node.position.x
这个值还是readonly

position / rotation及其分量现版本都属于只读属性。想要修改就必须用setposition / setrotation方法。而且这两个方法的参数目前只接受v3参数,即一个值。而不能写三个分量进去。

建议没事可以点到源代码看看,大部分方法的参数你就知道时什么类型了。

我只是觉得挺麻烦的,没说不对啊:joy:
还有并不是只有setposition才能更改,你可以看一下我发的,this,node.positon.set()是可以单独修改x,y,z得值得,只不过修改x可以只传一个参数,而修改z需要传入x,y,z得三个参数而已啦

为什么要这样设计呢?因为当你设置结点位置时,引擎要做一些其它事,比如更新世界矩阵缓存等。Node.prototype.position 实际上是一个访问器,引擎就是在访问器里面安插了这些逻辑。但你要是设置 node.position.x,引擎根本无法知道。

可能你会问,那为什么不搞个 Node.prototype.positionX 访问器呢?可以但是没必要,那需要搞的太多了:scaleXscaleY 等。

嗯,我的意思是既然因为.x直接赋值引擎不好监听得到,既然有set方法,那么就应该和setposition区别开,传入一个obj格式得{
x?,
y?
z?
}
岂不是更加的方便,现在得set方法,如果只是更新z轴一个属性,就需要把x,y属性都进行填入,那就和直接setPosition一样了。传obj需要更改那个值传那个值,这样引擎也可以监听得到,毕竟还是set方法,用户使用也会更加便捷

unity也是这样的,我觉得没什么毛病

我没说有毛病啊,只是属性赋值既然setPosition有了,之后加了个position.set(),他的传参很迷啊,x?y?z?重点在这啊,我想单独传个z,必须传x和y,那不如直接和setposition一样不久好了
我说的很不明白》?

怎么可能不知道呢,你们引擎内置的cc.js.getset方法不是干这个用的么?

所以手动设置this.node.position.x 或者调用position.set方法虽然能改变那个值,但是如果要修改物体的实际位置还是要调用setpotion方法是吗

是的,3.3中x,y,z参数都必须带上。
我们项目写了个工具类,把2.x的写法封装到3.3,把必须三个参数的函数改成可以一个,例如setPositionY,setScaleX

可以学习一下vue2升级vue3,用es6的proxy,全量代理下