假如我想在自定义窗口中显示文件夹的结构,并且可以用鼠标选择对应的文件。如下图所示,文件夹的结构我显示在了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程序研究院 发表