问题描述
是否有可能知道我的网格渲染器不是 visible,因为它被另一个游戏对象遮挡了?根据我的研究,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
会返回false,并且OnWillRenderObject()
会在被遮挡物移出遮挡物的事件中执行OnBecameVisible()
后不断执行回来,就这样进入了镜头的视线。但是我得到 .isVisible = true
和 OnWillRenderObject()
抛出的日志。
我知道场景视图相机也会导致此值为真。解释的结果不考虑场景相机,只考虑游戏相机(激活遮挡剔除)。 我采用这种方法来按照 documentation 步骤烘焙场景遮挡选项。但我在这里的更多问题是,是否渲染与遮挡设置有关,是要知道游戏对象或网格是否在其他对象的“顶部”渲染(在未应用剔除的情况下)。 Unity 需要处理这个问题,因为它是在场景中进行渲染的方式。
似乎有很多有用的选项 here 可以满足我的要求,但是,要使 .isVisible
工作,我需要设置和烘焙遮挡场景选项 (afaik)。所以 .isVisible
对“isRendered”的反应更多
事实。根据文档,Renderer.isVisible
不应该以直接/简单的方式给出我预期的结果,并且不受动态遮挡渲染与否的影响?
编辑:据我检查,似乎只有光线投射才能解决几何体的阻塞问题。所有这些其他东西都意味着“可见”,因为相机的渲染管道必须以某种方式考虑对象。 通过光线投射,我可以获得由碰撞确定的“物理”块。没有办法确定“图形”块吗?正如我所说,这是在某个地方找到的,以便在显示屏中相应地重新显示,那么该信息是否可用?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)