是否有可能知道我的网格渲染器不可见,因为它被另一个游戏对象遮挡了?根据我的研究,Rederer.isVisible
响应“isRendered”并且需要烘焙场景参数。所以我想知道是否有一种简单的方法可以知道场景元素是否以简单的方式呈现在其他元素之上。下面有更大的解释。
考虑一个简化的用例,有一个摄像头(启用了遮挡剔除)、一个遮挡器和一个遮挡物,如下所示:
禁用阴影选项(对于遮挡物和被遮挡物。我认为仅对被遮挡物禁用此选项,但对两者都禁用以防万一):
还有一个简单的脚本来检查可见性选项:
using UnityEngine;
public class RenderCheck : MonoBehaviour
{
MeshRenderer mr;
private void Start()
{
mr = GetComponent<MeshRenderer>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) {
bool isVisible = mr.isVisible;
Debug.Log($"cube visible: {isVisible}");
}
}
void OnBecameVisible() {
Debug.LogError($"{this.GetHashCode()} VISIBLE!!");
}
void OnWillRenderObject() {
Debug.LogError($"{this.GetHashCode()} VISIBLE!!");
}
}
我期望的结果是被遮挡物.isVisible
将返回假,并且在被遮挡物被移出遮挡物的事件OnWillRenderObject()
执行后将不断执行,因此进入相机的视线。OnBecameVisible()
但是我得到.isVisible = true
了OnWillRenderObject()
.
我知道场景视图相机也会导致该值为真。解释的结果不考虑场景相机,只有 gamePlay 相机(激活了遮挡剔除)。我得到了这种方法来按照文档步骤烘焙场景遮挡选项。但是我在这里的问题更多是关于遮挡设置是否渲染,是要知道游戏对象或网格是否在其他“顶部”渲染(在不应用剔除的情况下)。Unity 需要处理它,因为它是渲染在场景中发生的方式。
对于我所追求的东西,这里似乎有很多有用的选项,但是,为了.isVisible
工作,我需要设置和烘焙职业场景选项(afaik)。因此.isVisible
更多地响应“isRendered”事实。根据文档,不应该Renderer.isVisible
以直接/简单的方式给出我期望的结果,并且不受渲染或不被动态遮挡的影响?
编辑:据我检查,似乎只有光线投射可以解决几何阻塞问题。所有这些其他东西都意味着“可见”,因为相机的渲染管道必须以某种方式考虑对象。通过光线投射,我可以获得由碰撞确定的“物理”块。没有办法确定“图形”块吗?正如我所说,这是在某个地方计算出来的,以便在显示屏上相应地重新呈现,那么这些信息是否可以通过某种方式获得?