所以我有以下问题:我有一个世界空间画布跟随箭头在屏幕上移动。画布本身就是箭的孩子。问题是,有时当箭头指向屏幕边缘的某些东西时,画布部分会离开屏幕。我想编写一些代码,始终将整个画布保留在视口中。我在网上找到了一个解决方案,但这样就可以将对象的轴心点保持在摄像机范围内,而不是整个对象。我只是想弄清楚如何将整个对象保持在摄像机范围内。这是我的代码:
void LateUpdate()
{
transform.rotation = rotation;// This simply keeps the objects original rotation independant from the parent
Vector3 pos = Camera.main.WorldToViewportPoint(transform.position);
pos.x = Mathf.Clamp01(pos.x);
pos.y = Mathf.Clamp01(pos.y);
transform.position = Camera.main.ViewportToWorldPoint(pos);
}
答案 0 :(得分:0)
您可以在GameObject
周围定义某种边界框,然后检查所有角点是否在视口内(如果不移动对象)
为了定义边界矩形,您可以使用设置为触发器的BoxCollider
(以防止它与周围环境发生碰撞)。使用碰撞器Center
和Size
,您可以确定所有角点并将其用于边界检查。
如果你不想使用碰撞器,你可以写一个简单的类/结构,你可以在其中定义一个假想的边界框的中心和扩展(也许使用Gizmos
来绘制它编辑器,看看它有多大以及如何定位。
希望这有帮助。
修改强>
好的,正如您所提到的,您可以使用GetWorldCorners
来检索3D角点。要检查这些是否在视口中,您只需使用Camera.main.WorldToViewportPoint
对其进行转换,并检查它们的x和y分量是否在[0,1]中。如果现在例如你的画布走出右侧的屏幕,则2个右角点的x分量值将> 1,例如1。 1.5,这意味着它必须移动(-0.5, 0)
(视口坐标)。您现在可以尝试将视口坐标中的画布中心移动(-0.5, 0)
,并将结果点投影到世界空间中。这个投射点应该是画布中心的位置。
如果你想要更精确并且想要旋转3d画布,你可以移动和变换所有4个角点并相应地移动/旋转画布