Unity3D编辑器之自定义窗口显示文件夹结构
假如我想在自定义窗口中显示文件夹的结构,并且可以用鼠标选择对应的文件。如下图所示,文件夹的结构我显示在了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
|
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
- 本文固定链接: http://www.xuanyusong.com/archives/3880
- 转载请注明: 雨松MOMO 2016年01月27日 于 雨松MOMO程序研究院 发表