C# 如何使用TestPlanesAABB确定UI元素在滚动视图中是否完全可见

C# 如何使用TestPlanesAABB确定UI元素在滚动视图中是否完全可见,c#,unity3d,C#,Unity3d,我在Unity 3D中使用滚动视图。我只希望按钮在屏幕上完全可见时才可单击(而不仅仅是边缘显示的一小部分),因此,在做了一些研究之后,我尝试用以下内容编写一个测试函数: private bool isFullyVisible(GameObject obj) { var planes = GeometryUtility.CalculateFrustumPlanes(Camera.main); var image = GetComponent<Image>();

我在Unity 3D中使用滚动视图。我只希望按钮在屏幕上完全可见时才可单击(而不仅仅是边缘显示的一小部分),因此,在做了一些研究之后,我尝试用以下内容编写一个测试函数:

private bool isFullyVisible(GameObject obj) {

    var planes = GeometryUtility.CalculateFrustumPlanes(Camera.main);
    var image = GetComponent<Image>();
    var bounds = new Bounds(image.transform.localPosition,image.rectTransform.rect.size);

    return GeometryUtility.TestPlanesAABB(planes, bounds);


}
private bool完全可见(GameObject obj){
var planes=几何有效性。CalculateFrustumPlanes(Camera.main);
var image=GetComponent();
var bounds=新边界(image.transform.localPosition、image.rectcontransform.rect.size);
返回GeometryUtility.TestPlanesAABB(平面,边界);
}
不幸的是,此函数返回屏幕上的所有对象,使其完全可见,即使其中一些对象仅显示一小部分。什么是错误的以及如何使其工作?

这里的“问题”是,如果传递的碰撞器的任何部分在卷内,
TestPlanesAABB()
将返回true

您可以将此测试视为“这两个碰撞器相交吗?”,其中
平面[]
数组表示(严重扭曲)立方体的曲面

要解决此问题,您需要按按钮大小插入
平面[]
。这可能很容易做到,也可能不容易做到


或者,您可以为按钮使用点大小的碰撞器,并测试中心是否可见(并且只接受如果至少有一半的面可见,按钮将是可点击的)。或者,您可以用这种方式测试所有四个角,只有在四个角都可见时才允许单击按钮(实际上,您可以抄近路,只要三个角都可见:如果第四个角轴对齐且三个角通过,则第四个角必须可见)。

谢谢@Draco18s。我喜欢你的测试3个角的解决方案,但我有点担心在你需要在每一帧检查的情况下使用(例如:on update())。。您需要检查元素何时完全进入屏幕。这会不会严重影响性能?您是否想到了更好的解决方案?@raphadko如果您在更新时执行此操作,请从相机获取一次
平面[]
,并将其传递给每个按钮的
isFullyVisible()
方法。这将减少对每帧的处理。但是CPU的总使用率应该不会太差。我做了一个关于这个的后续问题,如果你能帮助我,我将非常感激: