赞
踩
GetRect|GetControlRect
rect
数据GetRect
函数本身就是预留空间,无论你是否在该空间绘制东西,这片空间都会占用 Rect rect = GUILayoutUtility.GetRect(10, EditorGUIUtility.singleLineHeight*5);
GUILayout.Button("我是下面的控件", GUILayout.Width(100), GUILayout.Height(100));
button
按钮也是在其后的GetControlRect
和他的作用差不多 var rect = EditorGUILayout.GetControlRect(GUILayout.height(50));
GUILayout.Button("我是下一个控件");
GetControlRect
和GetRect
函数内部调用了相同的函数UnityEditor.dll
发现果然如此GetControlRect
函数内部还是调用了GUILayoutUtility.GetRect
GUILayout.GetRect()
函数内部又调用了自身的DoGetRect
DoGetRect
本身是一个私有方法,没有暴露出来。所以我们没法使用GetLastRect
GUILayout.Button("My button");
if (Event.current.type == EventType.Repaint &&
GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
{
GUILayout.Label("Mouse over!");
}
else
{
GUILayout.Label("Mouse somewhere else");
}
MyButton
按钮区域的时候,下方的字体就会显示为MouseOver
GetLastRect
获得上个自动布局控件的位置,然后计算下一个控件的位置,用GUI
绘制的控件,不会占据GUILayout
绘制的位置,所以可以重叠,实现背景 var lastRect = GUILayoutUtility.GetLastRect();
//额外+2是因为我发现自动布局的控件在y轴上都有很细微的间隙,导致button和背景无法完全重叠
var newLastRect = new Vector2(lastRect.x, lastRect.y + lastRect.height+2);
EditorGUI.DrawRect(new Rect(newLastRect, new Vector2(lastRect.width, 30)), Color.green);
//新建style也是这个原因,需要把外边距全部设置为0,才能让button和背景起始点全部重合
GUILayout.Button("我是下面的控件", new GUIStyle("button") { margin = new RectOffset(0, 0, 0, 0) }, GUILayout.Width(100), GUILayout.Height(30));
GetRect
函数来计算获得下一个控件的位置,相当于把我GetLastRect+height
这一步省略了,代码如下 //注意 我这里本来想省略为 GUILayoutUtility.GetRect(0,height);
//但是会导致问题,GetRect是用来保留空间的,我们保留一个宽高为0的空间,
//然后再改变rect的height不会占用高度空间
//但是一开始就在GetRect里面分配这个高度,就会影响后续的绘制,无法达到背景的效果
Rect rect = GUILayoutUtility.GetRect(0, 0).ResizeHeight(height);
GUI.Box(rect, "",EditorStyles.textArea);
GUILayoutUtility.GetRect(0,height)
就会变成下面情况,高度占用了空间
GUILayout.BeginHorizontal();
GUILayout.Label("我是第一个位置",GUILayout.ExpandWidth(false));
var rect = EditorGUILayout.GetControlRect();
//也可以使用下面的函数
//var rect = GUILayoutUtility.GetRect(0,18);
GUILayout.Button("我是第三个");
GUI.Button(rect, new GUIContent("我是下一个"));
GUILayout.EndHorizontal();
EditorGUIUtility.singleLineHeight
,这个高度就是18,而宽度则会默认取尽可能扩展的宽度
GetControlRect()== GUILayoutUtility.GetRect(0,18);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。