如何通过代码访问 RectTransform 左、右、上、下位置?
How to access RectTransform's left, right, top, bottom positions via code?
我有一个 UI Canvas 设置了渲染模式世界 space。对于属于此 canvas 的所有 UI 元素,我在 RectTransform 组件中看到 'left'、'right'、'top' 和 'bottom' 变量编辑。有什么方法可以通过代码访问这些变量?
那些会是
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;DR
根据检查器中显示的值,我的分析是如果相应的边界在矩形中,Left
、Right
、Top
和 Bottom
为正由 RectTransform
.
的锚点塑造
offsetMin.x
as Left
and offsetMin.y
as Bottom
始终满足此评估但是 offsetMax.x
as Right
and offsetMax.y
因为 Top
没有。
我只是取了 offsetMax
的相反值以使其符合要求(基本 space 修改)。
以上两个答案还算对,我的项目因此拖延了一段时间,但在床上编程时才发现。 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);
}
如果你把它插入一个虚拟的 class 它应该给你正确的读数,不管你使用什么锚点。
它的工作方式应该是显而易见的,但简单的解释也无妨。
偏移量指的是最小值和最大值与矩形变换中心点的位置差异,将它们添加到锚边界给出正确的矩形变换的最小值和最大值。尽管锚点最小值和最大值已归一化,因此您需要乘以屏幕尺寸来缩小它们。
您还可以更轻松地在两行中设置所有值。只需获取 Vector2 的 offsetMin 并设置两个参数(第一个是 Left,第二个是 bottom)。然后对 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);
我有一个 UI Canvas 设置了渲染模式世界 space。对于属于此 canvas 的所有 UI 元素,我在 RectTransform 组件中看到 'left'、'right'、'top' 和 'bottom' 变量编辑。有什么方法可以通过代码访问这些变量?
那些会是
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;DR
根据检查器中显示的值,我的分析是如果相应的边界在矩形中,Left
、Right
、Top
和 Bottom
为正由 RectTransform
.
offsetMin.x
as Left
and offsetMin.y
as Bottom
始终满足此评估但是 offsetMax.x
as Right
and offsetMax.y
因为 Top
没有。
我只是取了 offsetMax
的相反值以使其符合要求(基本 space 修改)。
以上两个答案还算对,我的项目因此拖延了一段时间,但在床上编程时才发现。 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);
}
如果你把它插入一个虚拟的 class 它应该给你正确的读数,不管你使用什么锚点。
它的工作方式应该是显而易见的,但简单的解释也无妨。
偏移量指的是最小值和最大值与矩形变换中心点的位置差异,将它们添加到锚边界给出正确的矩形变换的最小值和最大值。尽管锚点最小值和最大值已归一化,因此您需要乘以屏幕尺寸来缩小它们。
您还可以更轻松地在两行中设置所有值。只需获取 Vector2 的 offsetMin 并设置两个参数(第一个是 Left,第二个是 bottom)。然后对 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);