有关2d项目的RectTransform相关问题
unity3d吧
全部回复
仅看楼主
level 5
Laffel😷 楼主
首先是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
Laffel😷 楼主
嘤嘤嘤救命呀
2023年05月31日 05点05分 2
level 5
太巧了兄弟,昨天刚遇到这个问题,先直接给你代码
2023年05月31日 07点05分 3
emmmm好像还是有点问题部分检测正确了部分还有问题我排查下我其他代码[泪]
2023年05月31日 07点05分
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
堆叠检测前
2023年05月31日 08点05分
@可视角度不一样 这下一个都不堆叠咯,我肯定代码哪里有逻辑问题了。。。
2023年05月31日 08点05分
@可视角度不一样 太迷惑了,我发现一摸一样的代码多检测几次才能全部检测到全部对象,明明应该每次都全部遍历的。。。快崩溃了[泪]
2023年05月31日 08点05分
我现在在start里把同一个方法调用两遍结果就是正确的emmmmm累了不管了就这样了反正现在能跑了就先不动了[泪]
2023年05月31日 09点05分
level 5
Laffel😷 楼主
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
1