3.x设置位置只能通过setPosition吗

受够了,好想像2.x那样 this.node.x+=1,每次都要设置position真的很烦

而且真的很不方便

是的,要么setPosition要么重新赋值position,没法单独赋值x y z

为啥制作组要这样设计呢,明明之前那个就很好用

如果你玩过c++ 就不会问了

咋了,我问个问题非要玩c++吗,又没问你

1赞

这个跟c++没有关系,只是目前官方这么设计罢了,c++不背这个锅

他就是秀一下他是2Dx时代的人会用c++罢了

2赞

可以尝试继承封装下,看能不能实现

有一定的关系,c++ 设计就是不能直接赋值成员变量啊。 一般都是通过函数赋值,直接赋值有可能不方便查找值修改。

我自己扩展了下 Node,可以参考 width 和 height,就是用的时候引擎代码会 console.warn

关底层什么事。。。我是写ts、js而不是写cpp,即使我不懂cpp,我也知道ts有个get和set。。。

主要原因还是因为升维后,属性爆炸。
2.x 主要面向 2D,所以顶多就 x y scaleX scaleY angle,5 个

3.x 就得有 xyz scaleXYZ eulerAngleXYZ, angle 10 个……
问题来了,既然 local TRS 支持了,world 的呢?再来 9 个。一共 19 个。晕不晕?

就算不晕,问题来了,属性过多的话,性能是会降低的…… 访问 Node.prototype 时速度可能会变慢……

1赞

我认为至少要支持this.node.position.x = X这种赋值。本来也就是给vector做的拓展。标记一下调整的dirty,用户体验还是很重要的。就好比我老板天天说的,别人家的都行,就你们不行?

也不是暴躁啦,就是一直用setPosition用得很烦,在只想移动某一个轴的时候setPosition真的很不方便

这个详细数据有吗,我之前只看过 V8 属性多了后会转字典模式,但不是说原型对象会保持快速模式吗,还是其他的问题?

没啥问题的,xyz也可以用set方法去单独设置,只不过引擎只提供了get

上面两种方法都会导致原生平台出现问题,因为单独设置 _lpos 或者 position 的 x, y, z 分量,无法将数据成功更新到原生数据结构中,因为 Vec3 是没有 getter setter 绑定的,分量 set 也不可能反射到 position 属性的 setter 上。基于跨平台需求我们禁止单独设置 position 分量,其他 vec3,mat4 类型的属性同理。Vec3 和 Mat4 使用的地方过于广泛,我们尽可能将其实现成简单的 JS Object,而不是各种 getter setter,为的也是避免影响性能,所以上面说的 Vec3 属性 dirty 或 notification 方案也不行。

另外就是 Jare 说的,属性数量太多,的确会导致对象整体被转化为字典访问模式,所有 Node API 性能都会收到极大影响,直接导致游戏性能下降十倍以上。

所以我们只能保守的将 Node 的 Vec3,Mat4 属性设置为 readonly

1赞

你信不信终有一天会改回来,我狠下诺言,到时候你们又有另一套说辞,所以说白了关cpp什么事,,cpp不被这个锅,直接说这是实现抉择罢了~

咱们讨论的就是现在的技术方案和设计思路啊。
跟 Cpp 的关联就是 Node 是 JS 和 Cpp 两份对象数据,需要在两边同步数据,一旦设置了 Vec3 分量就会破坏这个同步。当然,我们可以提供可靠的 x, y, z 属性,但是不这样做是为了避免 Node 属性过多。
我不理解哪里没说清楚