我有一个带有渲染模式世界空间集的UI Canvas。对于属于此画布的所有UI元素,我看到' left',' right',' top'和'底部'编辑器中RectTransform组件中的变量。有没有办法通过代码访问这些变量?
答案 0 :(得分:34)
那些将是
RectTransform rectTransform;
/*Left*/ rectTransform.offsetMin.x;
/*Right*/ rectTransform.offsetMax.x;
/*Top*/ rectTransform.offsetMax.y;
/*Bottom*/ rectTransform.offsetMin.y;
答案 1 :(得分:2)
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
Left
和offsetMin.y
Bottom
始终满足此评估,offsetMax.x
为Right
和offsetMax.y
为{ {1}}没有。
我只是使用Top
的相反值来使其符合(基本空间修改)。
答案 2 :(得分:2)
以上两个答案都在正确的轨道上,我一直拖延我的项目,但在床上编程时发现了。 offsetMin和offsetMax是你需要的,但它们并不是一切,你需要包含rect变换中的锚点:
float4 transformed = mul(float4(pos, 1.0f), g_InverseViewProj);
return (transformed / transformed.w).xyz;
如果你将它插入一个虚拟课程,它应该给你正确的读数,无论你使用什么锚点。
它的工作方式应该是显而易见的,但一个小的解释不会受到伤害。
偏移是指min和max距rect变换中心点的位置差异,将它们添加到锚点边界给出正确的矩形变换的min和max。虽然锚定最小值和最大值都是标准化的,但您需要通过乘以屏幕大小来缩放它们。
答案 3 :(得分:0)
您还可以更轻松地将所有值设置为两行。只需获取offsetMin即Vector2并设置两个参数(第一个是Left,第二个是bottom)。然后用offsetMax做同样的事情(第一个是右边,第二个是顶部)。请记住offsetMax是反转的,所以如果你想设置Right = 20,那么你需要在脚本中设置值-20。
下面的代码设置值:
左= 10,
Bottom = 20,
对= 30,
Top = 40
GameObject.GetComponent<RectTransform> ().offsetMin = new Vector2 (10,20);
GameObject.GetComponent<RectTransform> ().offsetMax = new Vector2 (-30,-40);
我希望它会帮助别人;)
答案 4 :(得分:0)
我需要经常调整这些属性,因此我添加了一种更短,更方便的方式来设置它们。
我为 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);