level 5
首先是RectTransform.rect.Overlaps返回值不正确,该方法我理解为检测rect重叠返回布尔值,但是我使用后无论是否重叠始终返回true,以下为代码 this.gameObject.GetComponent<RectTransform>().rect.Overlaps(otherGameObject.GetComponent<RectTransform>().rect)另外游戏关卡中附加该脚本的对象的父对象也有RectTransform组件不知道是否是受到了相对坐标系的影响导致检测错误,overlaps检测的对象和当前对象也不在同一个父对象下。然后我尝试使用RectTransform.GetWorldCorners获取四角坐标来检测重叠,在另一个类中start调用(自身start也试过返回值也不对),但是返回值依然有问题同一个父对象下所有对象返回值完全一样,我最后改成这些对象游戏中点击再GetWorldCorners并打印这时返回值才正确了,start时调用返回值就有问题,我怀疑是因为这些对象的父对象有grid layout group组件影响。
2023年05月31日 05点05分
1
level 5
static Rect tempRect1;
static Rect tempRect2;
public static bool RectOverlaps(RectTransform rectTransform1, RectTransform rectTransform2, Camera camera)
{
tempRect1 = rectTransform1.rect;
tempRect1.position = camera.WorldToScreenPoint(rectTransform1.position);
tempRect1.position -= camera.pixelRect.size / 2;
tempRect2 = rectTransform2.rect;
tempRect2.position = camera.WorldToScreenPoint(rectTransform2.position);
tempRect2.position -= camera.pixelRect.size / 2;
if (Mathf.Abs(tempRect1.position.x - tempRect2.position.x) < tempRect1.size.x / 2 + tempRect2.size.x / 2 &&
Mathf.Abs(tempRect1.position.y - tempRect2.position.y) < tempRect1.size.y / 2 + tempRect2.size.y / 2)
{
return true;
}
return false;
}
2023年05月31日 07点05分
4
我超老哥牛皮我先去试试
2023年05月31日 07点05分
level 5
昨天正好遇到这个检测的问题,不过我的情况和你不同,我是Overlaps检测始终有几个像素的偏差;我从摄像机参数到坐标转换到处检查,就是没发现哪里错了,最后才发现unity的Overlaps方法返回值不正确,直接心态炸裂;最后只能自己写一个,你可以直接用这个静态方法
2023年05月31日 07点05分
5
我这里返回值还是不对,同一个父对象下先生成的对象都会被后生成的对象堆叠,视图上看是没有堆叠的但检测出来就是emmmmm。。。我感觉跟grid layout group组件有关,在start时打印很多对象的rect数据,同一个父对象下所有对象数据全都一样emmmmmm
2023年05月31日 07点05分
level 5
start的时候计算?你试试在进行队列检测前调用一下:
Canvas.ForceUpdateCanvases();
这个呢
2023年05月31日 08点05分
6
level 5
Vector3[] rectCorners = new Vector3[4];
void GetRectCorners()
{
//获取rect四个角的相对世界坐标,数组顺序从左下开始按顺时针旋转
GetComponent<RectTransform>().GetWorldCorners(rectCorners);
}
bool CheckRectOverlap(Vector3[] selfRectCorners, Vector3[] otherRectCorners)
{
if(selfRectCorners[2].x > otherRectCorners[0].x &
selfRectCorners[2].y > otherRectCorners[0].y &
selfRectCorners[0].x < otherRectCorners[2].x &
selfRectCorners[0].y < otherRectCorners[2].y)
//这里大意为检查self的右上角是否在other左下角的右上象限内,self的左下角是否在other右上角的左下象限内
{
return true;
}
return false;
}
2023年05月31日 09点05分
7