根据子对象计算游戏对象的边界框

与Unity的2D游戏。 有一个父游戏对象,有几个儿童对象分散在整个场景。

我想计算父游戏对象的边界矩形。

让黑点成为孩子的对象。 红色的矩形是边界框。 我对这个位置不是很感兴趣 – 我只想要这个盒子的尺寸。

当然,边界框也应该考虑孩子的边界框…等等。

在这里输入图像描述


我怎样才能做到这一点? 我听说Renderer有一个bounds属性…但我的父对象没有渲染器。 而当我把一个,无论如何,值是0

 Bounds GetMaxBounds(GameObject g) { var b = new Bounds(g.transform.position, Vector3.zero); foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) { b.Encapsulate(r.bounds); } return b; } 

我不使用统一,但我相信你所需要做的是find你的父对象的X和Y值,然后基于边界框的X和Y值是第二个屏幕,例如 在这里输入图像描述

例如,如果您的2D游戏正在XY平面上,您只需要在Global / WorldSpace中确定4个点。 这些点将是红色矩形的四个角落,它们的坐标将会形成:

  • 最大X坐标在所有的孩子
  • 最大Y坐标在所有的孩子
  • 分钟X坐标全部儿童
  • 分钟Y坐在所有的孩子

计算孩子的局部边缘坐标时,可以使用边界框或边界圆(中心位置+/-半径)。 你所要做的就是维护4个variables,在这4个variables中保存你分析所有子对象的最大和最小x / y坐标

伪代码将如下所示:

 foreach( child in parent ) { if ( child.min_x < min_x ) min_x = child.min_x; if ( child.min_y < min_y ) min_y = child.min_y; if ( child.max_x > max_x ) max_x = child.max_x; if ( child.max_y > max_y ) max_y = child.max_y; } 

所以现在你将有这4个值让我们构成4点(伪代码):

 top_left = Point2D(min_x, max_y); top_right = Point2D(max_x, max_y); bottom_right = Point2D(max_x, min_y); bottom_left = Point2D(min_x, min_y); 

所以,现在你有矩形的角落,计算维度是直接的,因为你可以把二维点作为二维vector,并计算它们的距离,以确定红色框的边缘。 因此,您可以简单地计算点之间的差异,或使用Unity内置函数Vector2.Distance,如下所示:

 float BaseOfRedBox = Vector2.Distance(bottom_right, bottom_left); // the base float HeightOfRedBox = Vector2.Distance(bottom_right, top_right); // the height float AreaOfRedBox = BaseOfRedBox * HeightOfRedBox; // the Area 

你可以做更多的东西考虑二维点作为向量,并确定二维法线,所以…

所有的计算是在WorldSpace中进行的,如果您需要将点转换回屏幕空间,只需使用Unity函数camera.WorldToScreenPoint(…),其中相机是您的正交正交相机。