公司动态

[Unity Editor扩展]实现点Shift按键多选 + [Inspector系列]排序Reorder-List解析(复杂版本)

📅 2026/7/26 21:52:52
[Unity Editor扩展]实现点Shift按键多选 + [Inspector系列]排序Reorder-List解析(复杂版本)
OrderList列表的多选实现原理编译通过0 错误 0 警告。已实现 Shift点击范围多选普通点击 → 切换当前行勾选状态并记录锚点索引Shift点击 → 从锚点到当前行之间所有行全部设为相同状态勾选/取消lastClickedIndex在普通点击时更新Shift 点击时不更新锚点using (new EditorGUILayout.HorizontalScope()) { GUI.changed false; entry.selected EditorGUILayout.Toggle(entry.selected, GUILayout.Width(25)); if (GUI.changed) { if (Event.current.shift lastClickedIndex 0) { int start Mathf.Min(lastClickedIndex, i); int end Mathf.Max(lastClickedIndex, i); bool val entry.selected; for (int j start; j end; j) { var e entries[j]; e.selected val; entries[j] e; } } else { lastClickedIndex i; } Repaint(); }文章预总结第二个项目居然利用了面向对象实现了Unity所有数组均可实时编辑时排序所有数据均可重新排序。。。牛的。。。一个Editor扩展关于数组排序的“插件”原来“排序”这事儿真没看起来那么简单。本想做个“简单”工具——不就排个序嘛能有多难结果一上手就翻车一开始直接让 AI 给我写代码它还真给了……但那段OnGUI里狂刷数组的 demo一跑就卡死差点把我编辑器送走。于是赶紧换思路别造轮子了先看看开源项目吧比如第一个Star 1.6k界面也清爽看着挺靠谱……先戴个头盔以下内容可能涉及对某些“大厂半成品”的温和吐槽请勿对号入座。多个例子都带链接不一定是好的; 两个×一个√多个例子都带链接不一定是好的; 两个×一个√多个例子都带链接不一定是好的; 两个×一个√https://github.com/rotorz/unity3d-reorderable-list第一个项目开源工业垃圾国外的月亮不一定圆而开源也是有垃圾的本来以为是我离开 Unity 太久跟不上新玩法。结果一试——真是垃圾别下。打着大厂开源旗号核心模块XXXStudio.core居然缺失代码像是“复制粘贴 向上汇报”堆出来的实际一跑烂得像路边摊。连基本入门都做不到还谈什么功能强大一叶知秋用都用不起来的项目内核再牛也是白搭。声明没说阿里也没说云南白药请勿对号入座。真好奇大厂里是谁能把这种半成品跑通的怕不是神仙。这种“烫手山芋”项目资深者躲都来不及——谁接谁倒霉立 Flag 等于自爆。就算头铁硬上最后也只能靠吹牛收场。开源继续第二个项目https://github.com/arimger/Unity-Editor-Toolbox/tree/master这个看上去“很不好”而且版本是0.12 你敢不敢用只是列举入门例子吧代码不分析了这个项目从0 到0.12 更新了两年那么同理他们是不是计划更新十年第三个官方的GUI - OrderableListhttps://www.youtube.com/watch?vPba1x7D8pMQ最后的最后保底的项目 Odin但 Odin 好像默认不开源这次没有重新尝试如果这次前面3个都黄了这个项目是保底这个用过是真好用值得推荐。。。。因为有“”保护绳“”所以徒手攀爬101也不怕为什么说第一个项目是垃圾?很多时候真的只是“直觉”却相信第二个项目?第二个项目只要引入缺点还是很多的必然会“”大幅度“”改变实际作用也不大还可能有隐患参考https://blog.csdn.net/gitblog_00029/article/details/139460528https://newreleases.io/latest?starthf8yvn0开源第二个项目----附加代码解析using 写法需要继承 IDispose 减少了手动 appModifyusing (var serializedObject new SerializedObject(targetObject)) { var property serializedObject.FindProperty(List.propertyPath); smallerArraySize Math.Min(property.arraySize, smallerArraySize); }var serializedObject new SerializedObject(targetObject); var property serializedObject.FindProperty(List.propertyPath); smallerArraySize Math.Min(property.arraySize, smallerArraySize); serializedObject.ApplyModifiedProperties();//不用Using ,手动保存一下关键还是 XXXXHandler.cs -DrawProperty()上图中property.displayNamelabelGUIContent/// summary /// OnInspectorGUI();//外面就是这么调用 bt :Editor.cs /// /summary /// param nameeditor/param public static void HandleToolboxEditor(IToolboxEditor editor) { try { //Drawer OnGUI 从这里开始调用 ContextEditor editor.ContextEditor; OnBeginEditor(ContextEditor); editor.DrawCustomInspector(); } }1.强制全部CustomEditor (有开关可以关2.继承 IToolboxEditor, 必然DrawCustom()3.UnityEditor 扩展本身必然自带指向 serializedObject...[CustomEditor(typeof(Object), true, isFallback true)] public class ToolboxEditor : Editor, IToolboxEditor { public virtual void DrawCustomInspector() { Drawer.DrawEditor(serializedObject); } }4.默认的Drawer 默认的 DrawEditor的方法public void DrawEditor(SerializedObject serializedObject) { if (ToolboxDrawersManager.ToolboxDrawersAllowed) { DrawToolboxEditor(serializedObject); } else { DrawDefaultEditor(serializedObject); } }5.ToolboxPropertyHandler.cs6. 只要 indent 1property 就会自动跳转到子对象么EditorGUI.indentLevel; DrawPropertyChildren(property, drawElementAction); //while (targetProperty.NextVisible(enterChildren)) EditorGUI.indentLevel--;开源第二个项目----绘制Draw 代码Groupusing (var group new EditorGUILayout.FadeGroupScope(inspectorAnimBool.faded)) { if (group.visible) { DrawInspectorSettings(); } }Title#if UNITY_2019_3_OR_NEWER enabledToShowDrawerType GUILayout.Toolbar(enabledToShowDrawerType, drawerHandlersShortNames, EditorStyles.toolbarButton); #else enabledToShowDrawerType GUILayout.Toolbar(enabledToShowDrawerType, drawerHandlersShortNames); #endifReorder实现拖动排序有些复杂void DoList(XXXX) { { DoListMiddle(); DoListFooter(); } DoDraggingAndSelection(); }总结的总结开源99%是好的但总有那一两个粪作上面多个例子明显不一定是好的两个×一个√大公司里面很难出创新总是不起眼的小角落“萌芽”哪怕大公司说的再光鲜亮丽事实就摆在眼前总有些“意料中之外情理之中”合理合理TMD还是合理你要相信光你真的可以100%相信光就好像第二个项目的作者s他们是坚持几年一直在更新一直在更新他们是真的希望完全能改成自己喜欢的界面看到机会“”着力点“”并且自身完全有能力做到牛的sCENEvIEW 扩展第二个项目----如何实现 MouseUp 确定鼠标位置或者Element Index?private float GetElementHeight(int index, bool includeChildren true) { if (elementHeightCallback ! null) { return elementHeightCallback(index); } else { return EditorGUI.GetPropertyHeight(List.GetArrayElementAtIndex(index), includeChildren); } }