编辑器脚本中如何在预留矩形内使用GUILayout系列方法?
问题解决:GUILayout.BeginArea内控件不显示的修复
问题原因
GUILayout布局系统会维护一个「布局光标」,记录当前控件的绘制起始位置。当你通过GUILayoutUtility.GetRect获取矩形后,布局光标会自动移动到该矩形的底部。此时在GUILayout.BeginArea内部直接调用GUILayout.Button,按钮会从当前布局光标对应的位置(相对于区域的(0, rect.height)处)开始绘制,完全超出了BeginArea的范围,因此被裁剪无法显示。
解决方案
在GUILayout.BeginArea内部开启一个布局组(如垂直布局GUILayout.BeginVertical),这会重置区域内的布局光标到区域左上角,让GUILayout控件从正确的起始位置开始绘制。
修改后的完整代码
[CustomEditor(typeof(Foo))] public class TestAreaEditor : Editor { public override void OnInspectorGUI() { var rect = GUILayoutUtility.GetRect(100f, 100f); GUI.Box(rect, "Box"); UserDraw(rect); } public void UserDraw(Rect rect) { GUILayout.BeginArea(rect); // 开启垂直布局组,重置内部布局起点到区域左上角 GUILayout.BeginVertical(); GUILayout.Button("Button"); GUILayout.EndVertical(); GUILayout.EndArea(); } } public class Foo : MonoBehaviour { }
进阶优化(可选)
如果需要让控件在区域内居中或自定义排列,可以给布局组添加尺寸限制,并配合GUILayout.FlexibleSpace()实现:
public void UserDraw(Rect rect) { GUILayout.BeginArea(rect); GUILayout.BeginVertical(GUILayout.Width(rect.width), GUILayout.Height(rect.height)); GUILayout.FlexibleSpace(); // 顶部留白 GUILayout.Button("Button", GUILayout.Width(80), GUILayout.Height(30)); GUILayout.FlexibleSpace(); // 底部留白 GUILayout.EndVertical(); GUILayout.EndArea(); }
内容的提问来源于stack exchange,提问作者shingo
相关产品推荐
相关产品推荐

