Unity自定义Inspector面板之使用多选框模拟单选框
在Unity里面我们可以自己绘制Inspector面板UI,只要继承 Editor
类并重写 OnInspectorGUI
函数即可。EditorGUILayout
和 GUILayout
两个类为绘制UI组件提供了丰富的API。
[CustomEditor(typeof(MyClass))]
public class MyClassInspector : Editor
{public override void OnInspectorGUI(){DrawDefaultInspector();// custom UI}
}
如果我们想要一个多选一的选项,通常会想到单选框,也就是 radio button,但是在Unity里面,并没有提供绘制 radio button 的接口。最简单的替代方案是使用枚举类型和下拉框来实现多选一的效果。如果实在想要单选框的效果,可以使用开关(Toggle
)来模拟。
Toggle 是一种多选框,每个开关都有自己的状态,它和单选框的区别是单选框是公用同一个状态。所以,只要让多个 Toggle 共享同一个状态就可以了。
一开始我用了两个选项,用一个 bool
变量作为状态。
[CustomEditor(typeof(MyClass))]
public class MyClassInspector : Editor
{private bool status;public override void OnInspectorGUI(){DrawDefaultInspector();// custom UIstatus = !EditorGUILayout.ToggleLeft("a", !status);status = EditorGUILayout.ToggleLeft("b", status);}
}
效果如下:
他们确实只能选中一个,但是有个问题,点击已选中的那个选项会切换到另一个,而且 bool
值最多也只能承载两个选项,如果有超过两个选项,就需要用 int
来记录状态了。
[CustomEditor(typeof(MyClass))]
public class MyClassInspector : Editor
{private int status;public override void OnInspectorGUI(){DrawDefaultInspector();// custom UIif (EditorGUILayout.ToggleLeft("a", status == 0)) status = 0;if (EditorGUILayout.ToggleLeft("b", status == 1)) status = 1;if (EditorGUILayout.ToggleLeft("c", status == 2)) status = 2;}
}
效果如下:
可以看到还是只能选中一个,而且点击已选中的项也不会取消选中了。对于使用 bool
变量的情况也可以优化为这种方式。