首页 >Unity3D频道 >【Unity3D拓展编辑器】 > Unity3D研究院编辑器之自定义窗口显示文件夹结构(二十)
2016
01-27

Unity3D研究院编辑器之自定义窗口显示文件夹结构(二十)

假如我想在自定义窗口中显示文件夹的结构,并且可以用鼠标选择对应的文件。如下图所示,文件夹的结构我显示在了Inspector里,鼠标可以进行选择操作。

20160127233422
现在越来越懒,直接上代码吧。。

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

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院编辑器之自定义窗口显示文件夹结构(二十)》有 7 条评论

  1. 飞天大业主说:

    大佬, 在文件数量大时会因为GetGUIContent里的AssetDataBase.Load出现卡顿噢, 大概意图应该是过滤.meta, 改成
    private GUIContent GetGUIContent(string path)
    {
    if (path.EndsWith(“.meta”))
    return null;

    return new GUIContent(Path.GetFileNameWithoutExtension(path), AssetDatabase.GetCachedIcon(path));
    }
    会舒服很多

  2. 笨鸟说:

    如果我想双击inspector里的脚本文件打开脚本该咋做?

  3. 秦海刚说:

    有点问题想请教一下,如果不是在Insprctor 面板里面能不能写呢? 是完全自定义的窗口,该用哪一个GUI函数?

留下一个回复

你的email不会被公开。 必填项已用 * 标注。