老生常谈: setScale请文档写明

Cocos论坛老梗了:
setScale(new Vec3(x,y))
导致节点Z轴缩放成了0. 导致点击失效.

还是请官方大大们在代码setScaleAPI注释中备注一下, 特别是这API, 去年踩过一次, 今次遇到又忘记了:

/**
 * @en Set scale in local coordinate system
 * @zh 设置本地缩放
 * @param scale Target scale
 */
setScale(scale: Readonly<math.Vec3>): void;

可能觉得坑的人还不算多吧,,

new Vec3这个返回,一看就是会得到一个 (x, y, 0)的向量啊,z轴是0不该是正常的吗?
这里是不是该考虑使用另外的借口来设置?比如setScale(x, y)?

1赞

+1,去年我也踩了一次这个坑,排查才发现是用tween设置scale的时候z轴传0导致的点击失效

我们做2D的人没有3D大佬们思维的维度(字面意义)高啊。。。
关键这个事情一出现还特别难调试…
噼里啪啦几十几百行代码敲出来发现点击无效或者东西没了, 在回过头找还是挺麻烦的。
感觉API注释如果能够提醒一下会好很多。

可以使用 setScale(x, y)。如果传了 Vec3 的话,那只能是根据传入的参数值进行赋值了。引擎能做的可能只是加入一些在 debug 阶段打印一些 warning 信息了。

这个问题搞了我两天…当时就想爆粗. z的默认值不能是1或者不填就默认原来的值.非得是0吗

传分量有时候会很麻烦,支持传入 Vec2 的话可以不出现这种问题

这个原因是 Vec3 你传 x, y 的话,z 的默认值是 0 是合理的。Vec3 不是专门给 scale 设计的,它是个通用的数据结构。

如果是在 Node.setScale 里判断 Vec3 的值,如果传 0 就改为 1 也不是很合理:

  • 可能就是想设置为 0 起到隐藏的效果
  • 0 也是个合法的值,不能只针对 2D 来说它不合法它就是不合法的,毕竟 Node 也不是专门给 2D 用的。

另外就是引擎本身就有设置 x, y, z 的接口,可以用这个接口。

由于脚本语言没有函数重载机制,重载的写法已经很恶心了,再多一种类型的话会更恶心,而且还需要运行时判断,效率也有影响。

vec3强制填入xyz三个值,填不完整就报红得了,这下就不会忘了

这是一个思路。虽然我也没明白为什么之前允许参数可选,不过这样改的话又会涉及到破坏兼容性了。

自己封装一个类似于cc.v2呗,这不也快嘛image

1赞

重载写法的恶心是库作者(引擎方)去承担的,但会方便用户这边的使用。

效率是有影响,但这可以看性能的影响程度做一个权衡。

如果影响大,那可以做一个 2D 兼容模式的选项,在勾选后才支持 Vec2 的传入,这样性能洁癖也可以满足。

在不勾选时,代码直接被剔除,完全不影响,就类似这个。

image

方便新人、2.x 用户的加入。

如果影响大,那可以做一个 2D 兼容模式的选项,在勾选后才支持 Vec2 的传入,这样性能洁癖也可以满足。

影响大不大和游戏逻辑有关,没有标准答案。做兼容模式会导致引擎设计的复杂度增加,也增加引擎的使用难度(毕竟每多个选项都是带来负担)。

因此这个接口暂时不会修改。

注释优化一下就好啦。 给用户一点提示, 比如默认值是多少,可能会影响什么的。

2赞

骑灵子大佬说的好,,

所以说,有没有一款引擎,专门开发2d游戏的

所以说,有没有一款引擎,专门开发2d游戏的

引擎现在行为肯定是正确的。
主要这个问题确实在手册和文档都没有提到, 只能遇到了再来社区查找, 这点比较麻烦。