为啥 Unity Canvas Image 总是在我的游戏对象上渲染,即使它肯定在它们后面?

Posted

技术标签:

【中文标题】为啥 Unity Canvas Image 总是在我的游戏对象上渲染,即使它肯定在它们后面?【英文标题】:Why is Unity Canvas Image always rendering over my gameObjects even though it is definitely behind them?为什么 Unity Canvas Image 总是在我的游戏对象上渲染,即使它肯定在它们后面? 【发布时间】:2021-09-21 04:39:33 【问题描述】:

在我的 2d Unity 项目中,我有一个带有我想要作为背景的图像的画布。

我在这个背景前面有 2 个游戏对象。但无论我对 Pos Z、Sorting Layers 或层次排序做了多少摆弄,图像总是在对象的前面。

上面的 Gif 在 3d 模式下显示,即使图像明显位于这些对象的后面,但如果它们重叠,它将始终出现在它们之上。

层次结构:

主要 相机(检查员:https://i.imgur.com/Q5a52cf.png) BackgroundCanvas(检查员:https://i.imgur.com/m9Pxr6B.png) BackgroundImage(检查员:https://i.imgur.com/jTx7pEW.png) Object1(检查员:https://i.imgur.com/YcClEhk.png) 对象2

非常感谢任何将我从这种疯狂中解救出来的建议。

【问题讨论】:

您的画布位于屏幕空间中,因此始终位于 3D 对象之上。您是否尝试过使用世界空间画布? 我试过世界空间画布,不幸的是它产生了同样的问题。 (都附有事件相机,没有) 这是否正确:您有一个 3D 对象,您希望画布 在其前面,但该画布被 3D 对象隐藏了?我不太熟悉精灵对象的工作原理,但尝试将精灵排序层设置为“默认” 不完全:我在画布(我的 gif 中的绿色矩形,canvas Image)。画布位于“默认”排序层中,而精灵位于位于默认值之前的不同排序层中。但是,当发生重叠时,画布(肯定在精灵后面)会出现在它们的前面。游戏是 2d 的,但我制作了一个 gif 以 3d 模式显示它,只是为了更容易地显示 Canvas 肯定在精灵后面。 【参考方案1】:

将精灵渲染器的变换 z 值设置为 0 而不是 100

如果不能解决,请同时指定相机属性,以便我可以尝试重新创建确切的设置。

【讨论】:

抱歉耽搁了。将 SpriteRenderers PosZ 设置为 0 似乎不起作用。这是相机检查器设置:i.imgur.com/Q5a52cf.png 现在使用与您共享的相同设置,将精灵渲染器的变换 z 设置为 100,并将层中的顺序设置为 1 不幸的是,这似乎不起作用:( 我尝试根据您在问题中提到的内容和相机属性进行设置,对我来说这是当前输出:drive.google.com/file/d/1DFWZ5MIh54GFm-YNNgfJCj28EvocCqX6/… 如果您也可以直接将精灵渲染器作为背景而不是画布您不受任何其他约束。但这在设置方面似乎有点小失误,否则它应该可以工作,最近我一直在从事类似情况的项目。 非常感谢您花时间设置您自己的示例 @hiren-katira。通过这样做,我认为您是对的,这可能是我无法找到的大量代码中某个地方的一个小问题。我确实用一个简单的精灵渲染器进行了测试,这似乎工作得非常好(按照我的意愿出现在精灵后面),所以我想我现在会继续使用这种方法。非常感谢您的帮助:)【参考方案2】:

尝试点击Layers -> edit layers,在排序层内你可以更改订单抓取层,所有上层都出现在相机后面。

【讨论】:

【参考方案3】:

我遇到了同样的问题,我通过将相机连接到屏幕空间的画布并最终将对象的排序层更改为 -1 来解决它。

【讨论】:

以上是关于为啥 Unity Canvas Image 总是在我的游戏对象上渲染,即使它肯定在它们后面?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我用js创建的image在canvas里显示不出来?

unity中如何将Ui Image占满界面

Unity5.3——UI之Canvas

为啥不使用 html2canvas 和 canvas2image 将图表保存为 PNG 格式?

为啥我在html5中取到了canvas画布(已测试能取到),但是执行canvas.toDataURL("image.png")不成功,

unity为啥射线检测不到ui