【问题标题】:Find out an object's box actual 4 edges scaled to the screen/camera size (Unity 2D)找出一个对象的盒子实际 4 个边缘缩放到屏幕/相机尺寸(Unity 2D)
【发布时间】:2017-07-16 12:26:06
【问题描述】:

我正在编写一个函数来判断一个 2D 对象是否完全在另一个对象内部。 我通过获取对象的位置来做到这一点,然后使用这个位置和它的大小,计算对象的边缘位置,然后使用 Camera.main.pixelRect.Contains 进行检查。这是我当前的代码:

 // get the center of the object
 Vector2 pos = Camera.main.WorldToScreenPoint(card.transform.position);

 // get the bounding box
 var rect = image.transform.rect;

 var topLeft = new Vector2(pos.x - (rect.width / 2), pos.y - (rect.height / 2);


return Camera.main.pixelRect.Contains(topLeft);

我的问题是,刚接触 Unity,测量结果不匹配。当对象按屏幕尺寸缩放时,我很困惑,我会得到图像的实际宽度,但它计算错误。

我还测试了 rect :

rect = GetComponent<RectTransform>().rect;

有人可以帮我解决这个问题吗?

Ps:如果有更好的方法来检查 2D 对象何时完全在另一个对象中,我也会接受。

【问题讨论】:

  • 如果两个矩形接触,Rect#Overlap 将返回。如果点在矩形内,Rect#Contains 将返回。至于标量,总是将点转换为屏幕空间,或者永远不要这样做。不要混搭。如果转换层次结构都被奇怪地缩放,那么转换可能是最好的。

标签: unity3d unity5


【解决方案1】:

正如 Draco18s 所指出的,您将 pos 转换为屏幕空间,而不是 rect

如果您查看 WorldToScreenPoint() 的统一 API 文档 它说它

将位置从世界空间转换到屏幕空间。屏幕空间是 以像素为单位。

transform.position 返回

变换在世界空间中的位置。

您遇到的问题是将屏幕空间(以像素度量)和世界空间结合起来,这是完全不同的。

因为您使用的是pixelRect,我建议您更改var rect = image.transform.rect; 成为var rect = Camera.main.WorldToScreenPoint(image.transform.position);

当然,您还必须以类似的方式检查其他角,如果所有 4 个角都返回 true,则该对象在另一个内部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多