You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编辑器脚本中如何在预留矩形内使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 17:54:51