始终在对象视口中保留对象(世界空间画布)

时间:2016-08-01 09:55:34

标签: c# unity3d unity5

所以我有以下问题:我有一个世界空间画布跟随箭头在屏幕上移动。画布本身就是箭的孩子。问题是,有时当箭头指向屏幕边缘的某些东西时,画布部分会离开屏幕。我想编写一些代码,始终将整个画布保留在视口中。我在网上找到了一个解决方案,但这样就可以将对象的轴心点保持在摄像机范围内,而不是整个对象。我只是想弄清楚如何将整个对象保持在摄像机范围内。这是我的代码:

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);
}

1 个答案:

答案 0 :(得分:0)

您可以在GameObject周围定义某种边界框,然后检查所有角点是否在视口内(如果不移动对象)

为了定义边界矩形,您可以使用设置为触发器的BoxCollider(以防止它与周围环境发生碰撞)。使用碰撞器CenterSize,您可以确定所有角点并将其用于边界检查。

如果你不想使用碰撞器,你可以写一个简单的类/结构,你可以在其中定义一个假想的边界框的中心和扩展(也许使用Gizmos来绘制它编辑器,看看它有多大以及如何定位。

希望这有帮助。

修改
好的,正如您所提到的,您可以使用GetWorldCorners来检索3D角点。要检查这些是否在视口中,您只需使用Camera.main.WorldToViewportPoint对其进行转换,并检查它们的x和y分量是否在[0,1]中。如果现在例如你的画布走出右侧的屏幕,则2个右角点的x分量值将> 1,例如1。 1.5,这意味着它必须移动(-0.5, 0)(视口坐标)。您现在可以尝试将视口坐标中的画布中心移动(-0.5, 0),并将结果点投影到世界空间中。这个投射点应该是画布中心的位置。

如果你想要更精确并且想要旋转3d画布,你可以移动和变换所有4个角点并相应地移动/旋转画布