我有一个带有渲染模式世界空间集的 UI 画布。对于属于此画布的所有 UI 元素,我在编辑器的 RectTransform 组件中看到了“left”、“right”、“top”和“bottom”变量。有什么方法可以通过代码访问这些变量?
5 回答
那些将是
RectTransform rectTransform;
/*Left*/ rectTransform.offsetMin.x;
/*Right*/ rectTransform.offsetMax.x;
/*Top*/ rectTransform.offsetMax.y;
/*Bottom*/ rectTransform.offsetMin.y;
RectTransform rt = GetComponent<RectTransform>();
float left = rt.offsetMin.x;
float right = -rt.offsetMax.x;
float top = -rt.offsetMax.y;
float bottom = rt.offsetMin.y;
TL;博士
根据 Inspector 中显示的值,我的分析是,Left
如果相应的边界在.Right
Top
Bottom
RectTransform
offsetMin.x
一如既往Left
地履行这一评估,但作为offsetMin.y
和不这样做。Bottom
offsetMax.x
Right
offsetMax.y
Top
我只是取了相反的值offsetMax
来使其兼容(基本空间修改)。
上面的两个答案有点在正确的轨道上,因此我一直在拖延我的项目,但在床上编程时发现了。offsetMin 和 offsetMax 是您所需要的,但它们不是全部,您需要包含来自 rect 变换的锚点:
public RectTransform recTrans;
// Use this for initialization
void Start () {
Vector2 min = recTrans.anchorMin;
min.x *= Screen.width;
min.y *= Screen.height;
min += recTrans.offsetMin;
Vector2 max = recTrans.anchorMax;
max.x *= Screen.width;
max.y *= Screen.height;
max += recTrans.offsetMax;
Debug.Log(min + " " + max);
}
如果您将其插入一个虚拟类,无论您使用什么锚,它都应该为您提供正确的读数。
它的工作方式应该是显而易见的,但一个小的解释不会有什么坏处。
偏移量是指最小值和最大值与矩形变换中心点的位置差异,将它们添加到锚边界会给出正确的矩形变换的最小值和最大值。虽然锚的最小值和最大值是标准化的,所以你需要通过乘以屏幕尺寸来缩小它们。
您还可以更轻松地在两行中设置所有值。只需获取 Vector2 的 offsetMin 并设置两个参数(第一个是 Left,第二个是底部)。然后对 offsetMax 做同样的事情(第一个是正确的,第二个是顶部)。请记住,offsetMax 是相反的,因此如果您想设置 Right = 20,那么您需要在脚本中设置值 -20。
下面的代码设置值:
左 = 10,
底部 = 20,
右 = 30,
顶部 = 40
GameObject.GetComponent<RectTransform> ().offsetMin = new Vector2 (10,20);
GameObject.GetComponent<RectTransform> ().offsetMax = new Vector2 (-30,-40);
我希望它会帮助别人;)
我需要经常调整这些属性,所以我添加了一种更短、更方便的方法来设置它们。
我为RectTransform编写了一个扩展,您可以在其中非常简单地设置这些属性:
public static class Extensions
{
public static void SetPadding(this RectTransform rect, float horizontal, float vertical) {
rect.offsetMax = new Vector2(-horizontal, -vertical);
rect.offsetMin = new Vector2(horizontal, vertical);
}
public static void SetPadding(this RectTransform rect, float left, float top, float right, float bottom)
{
rect.offsetMax = new Vector2(-right, -top);
rect.offsetMin = new Vector2(left, bottom);
}
}
要使用扩展,您只需调用如下方法:
var rect = YourGameObject.GetComponent<RectTransform>()
// with named parameters
rect.SetPadding(horizontal: 100, vertical: 40);
// without named parameters (shorter)
rect.SetPadding(100, 40);
// explicit, with named parameters
buyButton.SetPadding(left: 100, top: 40, right: 100, bottom: 40);
// explicit, without named parameters (shorter)
buyButton.SetPadding(100, 40, 100, 40);