Unity中如何从List<int>集合获取最大值并设置窗口宽度?
解决Unity编辑器窗口最大宽度设置问题
原代码存在的问题
List<int> num若定义在OnGUI方法外,每帧调用OnGUI时会持续累加旧元素,导致最大值计算错误;需在OnGUI内初始化列表,保证每次都收集当前帧的文本框长度。window.maxSize = new Vector2(num[], position.height);存在语法错误,且未实现取最大值的逻辑。- 未处理
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
相关产品推荐
相关产品推荐

