假如我想在自定义窗口中显示文件夹的结构,并且可以用鼠标选择对应的文件。如下图所示,文件夹的结构我显示在了Inspector里,鼠标可以进行选择操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; [CustomEditor (typeof(UnityEditor.DefaultAsset))] public class FolderInspector : Editor { Data data; Data selectData; void OnEnable() { if (Directory.Exists (AssetDatabase.GetAssetPath (target))) { data = new Data (); LoadFiles (data,AssetDatabase.GetAssetPath (Selection.activeObject)); } } public override void OnInspectorGUI () { if (Directory.Exists (AssetDatabase.GetAssetPath (target))) { GUI.enabled = true; EditorGUIUtility.SetIconSize (Vector2.one * 16); DrawData (data); } } void LoadFiles (Data data,string currentPath, int indent=0) { GUIContent content = GetGUIContent (currentPath); if (content != null) { data.indent = indent; data.content = content; data.assetPath = currentPath; } foreach (var path in Directory.GetFiles(currentPath)) { content = GetGUIContent (path); if (content != null) { Data child = new Data (); child.indent = indent + 1; child.content = content; child.assetPath = path; data.childs.Add (child); } } foreach (var path in Directory.GetDirectories(currentPath)) { Data childDir = new Data (); data.childs.Add (childDir); LoadFiles (childDir,path, indent + 1); } } void DrawData(Data data) { if (data.content != null) { EditorGUI.indentLevel = data.indent; DrawGUIData (data); } for (int i = 0; i < data.childs.Count; i++) { Data child = data.childs [i]; if (child.content != null) { EditorGUI.indentLevel = child.indent; if(child.childs.Count>0) DrawData (child); else DrawGUIData (child); } } } void DrawGUIData (Data data) { GUIStyle style = "Label"; Rect rt = GUILayoutUtility.GetRect (data.content, style); if (data.isSelected) { EditorGUI.DrawRect (rt, Color.gray); } rt.x += (16 * EditorGUI.indentLevel); if (GUI.Button (rt, data.content, style)) { if (selectData != null) { selectData.isSelected = false; } data.isSelected = true; selectData = data; Debug.Log (data.assetPath); } } GUIContent GetGUIContent (string path) { Object asset = AssetDatabase.LoadAssetAtPath (path, typeof(Object)); if (asset) { return new GUIContent (asset.name, AssetDatabase.GetCachedIcon (path)); } return null; } class Data { public bool isSelected = false; public int indent =0; public GUIContent content; public string assetPath; public List<Data> childs = new List<Data> (); } } |
运行环境unity5.3
- 本文固定链接: https://www.xuanyusong.com/archives/3880
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
如果我想双击inspector里的脚本文件打开脚本该咋做?
有点问题想请教一下,如果不是在Insprctor 面板里面能不能写呢? 是完全自定义的窗口,该用哪一个GUI函数?
可以的。
能不能提示一下怎么改呢? 研究好一会都没成功,感觉没抓住关键点。
这个在实际应用