Creator 2.4.6 cc.Camera渲染Bug

  • Creator 版本: 2.4.6

  • 目标平台: 安卓、Windows模拟器

  • 重现方式:打开附件示例项目CameraRenderBug.zip (817.2 KB) ,用Windows模拟器或安卓运行。点击任意方块,会有两个方块变小(调整模拟器尺寸也会让显示正常)。取消CameraRenderBug.ts第20~22行的注释再运行,则正常。网页上无此问题。

  • 首个报错: 无报错

  • 编辑器操作系统: Windows 10

  • 重现概率: 100%

正常:


异常:

感谢反馈!!

@215194780 刚看了一下2.4.9还是没有修复这个问题, 麻烦再反馈一下~!
简单说就是,对一个节点和它的一个子节点截图时若先调整scale再截图然后恢复原scale,会导致其它没参与截图的子节点的大小都发生异常。重现的代码也非常简单就十几行,见示例项目。仅原生环境会有问题,Web不会。

嗯,已经反馈给相关人员了,抱歉!
这种相机动态单独渲染节点的情况一般是用于做什么的呢?

@215194780 多谢!!主要是用于截图和像素级的hitTest,我们做的是装扮养成游戏,大量用到区域截图和像素级的点击检测。

我反馈的问题的出现和发现过程是这样的:例如下图红框是一个物品节点上图片的尺寸,但是点击箭头处的空白透明区域时我们希望应该不是这个物品图片节点响应点击而是地板响应点击以便控制人物走近,这就需要像素级的hitTest:覆写node._hitTest,若原_hitTest判断点击到了这个node,则先对node截图,然后判断点击坐标对应的截图像素点是否是透明的,是透明的则当作没点击到,不是透明的才是真的点击到。

又因为判断像素点击并不需要非常精确,截图所消耗的时间又跟节点尺寸是n^2的关系,所以我们是先给node一个小的scale,截完图再改回原scale,这样截图会快scale^2倍。但这时候问题就出现了,hitTest是会遍历节点树的,某个子节点的_hitTest中截完图后若因点到透明区域而被判断没点中,会遍历到父节点的_hitTest中对父节点截图(截图时都会先给一个小的scale截完图再恢复原scale),这时没有遍历到的所有其它子节点,实际显示的大小都会变成父节点截图前临时设置scale(即使它们各自的node.scale属性仍是1,父节点的scale也已恢复为1)。

在游戏中的表现就是,点一下下图红框中箭头指的透明区域,除了红框的这个物品,所有其它物品都变小成scale倍了(即使这些物品的属性没有任何变化)。只有手动setTimeout(()=>父节点node.setLocalDirty(cc.Node._LocalDirtyFlag.ALL_SCALE),0);让父节点的ALL_SCALE变为dirty才可以。所以我判断是cc.Camera截图的时候可能忽略了所截图节点scale的先后变化,导致子节点的scale没有正确更新。示例项目中重现的就是这一过程。