【问题标题】:Keeping a object(world space canvas) always in the cameras viewport始终在相机视口中保留对象(世界空间画布)
【发布时间】:2016-08-01 09:55:34
【问题描述】:

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

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

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

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

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

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

    希望这会有所帮助。

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

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

    【讨论】:

    • 好吧,因为它是一个 RectTransform,所以有一个构建它的 GetWorldCorners 方法来获取 rect 变换的 4 个角。我想不通的是如何检查它们是否在视口中以及之后如何移动对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多