假如我想在自定义窗口中显示文件夹的结构,并且可以用鼠标选择对应的文件。如下图所示,文件夹的结构我显示在了Inspector里,鼠标可以进行选择操作。
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程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!


大佬, 在文件数量大时会因为GetGUIContent里的AssetDataBase.Load出现卡顿噢, 大概意图应该是过滤.meta, 改成
private GUIContent GetGUIContent(string path)
{
if (path.EndsWith(“.meta”))
return null;
return new GUIContent(Path.GetFileNameWithoutExtension(path), AssetDatabase.GetCachedIcon(path));
}
会舒服很多
感谢回答~
如果我想双击inspector里的脚本文件打开脚本该咋做?
有点问题想请教一下,如果不是在Insprctor 面板里面能不能写呢? 是完全自定义的窗口,该用哪一个GUI函数?
可以的。
能不能提示一下怎么改呢? 研究好一会都没成功,感觉没抓住关键点。
这个在实际应用