Unity Editor窗口如何实现各Toggle框独立切换true/false状态
问题根因
所有行的Toggle控件都绑定了同一个全局布尔变量include1。Unity Editor的OnGUI是每帧重复执行的,循环内生成的每个Toggle都会读取这个公共变量的值渲染勾选状态,点击任意Toggle时又会把新的勾选值写回这同一个变量,直接导致所有Toggle状态完全同步,改一个全变。
修复方案
要实现每个Toggle独立切换,必须给列表里每一个GameObject分配独立的状态存储空间,不能共用单个布尔变量。
- 删除原有单个
include1变量,新增和objects数组下标一一对应的布尔数组,用来存储每个对象对应的"Include Children"勾选状态 - 渲染前做数组长度校验,当
objects数组增删元素导致长度变化时,同步调整布尔数组长度,同时保留已有条目的原有勾选状态,避免下标越界 - 循环渲染Toggle时,读写当前循环下标对应的布尔数组元素,不再操作全局公共变量
修复后代码示例
首先替换类中的成员变量定义:
// 注释/删除原有单变量定义:public bool include1; // 替换为和objects一一对应的状态数组 public GameObject[] objects; public bool[] includeChildFlags;
然后替换OnGUI中折叠区域内的滚动列表逻辑:
if (showPosition) { EditorGUI.indentLevel++; scrollPos = EditorGUILayout.BeginScrollView(scrollPos); // 同步状态数组长度,避免下标越界 if (includeChildFlags == null || includeChildFlags.Length != objects.Length) { bool[] tempFlags = new bool[objects.Length]; if (includeChildFlags != null) { // 拷贝已有状态,避免调整数组长度时原有勾选状态丢失 int copyCount = Mathf.Min(includeChildFlags.Length, tempFlags.Length); System.Array.Copy(includeChildFlags, tempFlags, copyCount); } includeChildFlags = tempFlags; } for (int i = 0; i < objects.Length; i++) { EditorGUIUtility.labelWidth = 50; EditorGUILayout.BeginHorizontal(); { GUILayoutOption[] options = { GUILayout.MaxWidth(300.0f), GUILayout.MinWidth(300.0f) }; objects[i] = (GameObject)EditorGUILayout.ObjectField(i.ToString(), objects[i], typeof(GameObject), true, options); EditorGUIUtility.labelWidth = 112; // 读写当前下标对应的独立状态 includeChildFlags[i] = EditorGUILayout.Toggle("Include Children", includeChildFlags[i], GUILayout.ExpandWidth(true)); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUI.indentLevel--; }
后续执行重命名逻辑时,直接遍历includeChildFlags[i]就能拿到对应objects[i]是否需要包含子物体的配置。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

