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

Unity中如何从List<int>集合获取最大值并设置窗口宽度?

解决Unity编辑器窗口最大宽度设置问题

原代码存在的问题

  1. List<int> num若定义在OnGUI方法外,每帧调用OnGUI时会持续累加旧元素,导致最大值计算错误;需在OnGUI内初始化列表,保证每次都收集当前帧的文本框长度。
  2. window.maxSize = new Vector2(num[], position.height);存在语法错误,且未实现取最大值的逻辑。
  3. 未处理num为空的场景(比如dictio无元素时),会触发运行时异常。

修正后的完整代码

using System.Linq; // 必须引入Linq命名空间才能使用Max()方法

// ... 其他命名空间与类定义代码 ...

void OnGUI()
{
    GUI.color = Color.white;
    List<int> num = new List<int>(); // 每帧重新初始化列表,避免旧数据干扰

    scrollPos = EditorGUILayout.BeginScrollView(scrollPos, true, true,
        GUILayout.ExpandWidth(true), GUILayout.Height(position.height));

    foreach (KeyValuePair<GameObject, string> pair in dictio)
    {
        EditorGUILayout.BeginHorizontal();

        EditorGUILayout.ObjectField(pair.Key, typeof(GameObject), true);
        int textLength = EditorGUILayout.TextField(pair.Value).Length;
        num.Add(textLength);

        EditorGUILayout.EndHorizontal();
    }
    EditorGUILayout.EndScrollView();

    // 计算最大文本长度,处理空列表的边界情况
    int maxTextLength = num.Count > 0 ? num.Max() : 300;
    // 将字符长度转换为实际像素宽度,适配编辑器控件
    float singleCharPixelWidth = GUI.skin.textField.CalcSize(new GUIContent("A")).x;
    // 加上ObjectField的宽度余量,防止窗口过窄导致控件被截断
    float finalMaxWindowWidth = maxTextLength * singleCharPixelWidth + 220;
    window.maxSize = new Vector2(finalMaxWindowWidth, position.height);
}

核心说明

  • 每帧重新创建num列表,确保只统计当前帧所有文本框的内容长度。
  • 借助System.Linq的Max()方法快速获取列表最大值,需在脚本顶部添加对应的命名空间引用。
  • 直接用字符长度作为窗口宽度会导致显示异常,需将字符长度转换为编辑器内的实际像素宽度,并预留其他控件的空间。
  • 空列表时设置默认宽度,避免调用Max()方法时抛出异常。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:30