关闭

Unity 折叠树 EditorGUI.Foldout

1784人阅读 评论(0) 收藏 举报
分类:

需要两个类:树节点类和界面实现类


1:树节点类(TreeNode)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TreeNode {

	public enum TreeNodeType
	{
		Item,
		Switch
	}

	public string name;
	public TreeNodeType nodeType = TreeNodeType.Item;
	public TreeNode parent;
	public List<TreeNode> children = null;
	public bool isOpen = false;
	public static TreeNode _instance = null;

	public static TreeNode Get()
	{
		if (_instance == null) 
		{
			_instance = new TreeNode ();
		}
		return _instance;
	}

	public void InsertNode(TreeNode node)
	{
		if (this.children == null)
		{
			this.children = new List<TreeNode> ();
		}
		children.Add (node);
		node.parent = this;
	}

	public void OpenAllNode(TreeNode node)
	{
		node.isOpen = true;
		if (node.children != null && node.children.Count > 0) 
		{
			for (int i = 0; i < node.children.Count; i++) 
			{
				OpenAllNode (node.children[i]);
			}
		}
	}

	public TreeNode GenerateFileTree(List<string> list)
	{
		TreeNode root = new TreeNode ();
		root = GenerateFileNode ("", "生物/", list);
		OpenAllNode (root);
		return root;
	}

	public TreeNode GenerateFileNode(string parentFullPath,string path,List<string> list)
	{
		TreeNode node = new TreeNode ();
		string[] segment = path.Split ('/'); 
		if (segment.Length > 1)
		{
			string name = segment[0];
			node.name = name;
			node.nodeType = TreeNodeType.Switch;
			string fullPath = parentFullPath + name+"/";
			List<string> allChildrenPath = list.FindAll (s=>
				{
					if (s.StartsWith(fullPath) && s!=fullPath)
					{
						return true;
					}
					return false;
				}
			);
			List<string> dirList = new List<string> ();
			for (int i = 0; i < allChildrenPath.Count; i++) 
			{
				string childPath = allChildrenPath [i].Remove (0, fullPath.Length);
				string[] childPathSegment = childPath.Split('/');
				if (childPathSegment.Length > 1) {
					string childDirPath = childPathSegment [0];
					if (!dirList.Contains (childDirPath)) {
						dirList.Add (childDirPath);
						TreeNode childNode = GenerateFileNode (fullPath, childDirPath + "/", list);
						node.InsertNode (childNode);
					}
				}
				else
				{
					TreeNode childNode = GenerateFileNode (fullPath, childPath, list);
					node.InsertNode (childNode);
				}
			}
		}
		else
		{
			node.name = path;
			node.nodeType = TreeNodeType.Item;
			list.Remove (path);
		}
		return node;
	}
		
}


2:界面实现类(CreateTreeList)

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;

public class CreateTreeList:EditorWindow  {

	private List<string> list = new List<string> ();
	private static TreeNode root = null; 
	private TreeNode currentNode;
	private static CreateTreeList _instance = new CreateTreeList();
	private int treeIndex = 0;
	private static CreateTreeList window;     // 自定义窗体

	[MenuItem("H3D/构建树视图")]

	static void Init(){
		window = EditorWindow.GetWindow<CreateTreeList>();   // 创建自定义窗体
		window.titleContent = new GUIContent("构建树视图");         // 窗口的标题
		window.Show();
		_instance.GetAssets ();
		_instance.CreateTree ();
              // 创建树
	}

//	void Awake()
//	{
//		Debug.Log ("Awake");
//	}

	void Start()
	{
		Debug.Log ("Start");
	}

//	void Update()
//	{
//		Debug.Log ("Update");
//	}


	private void GetAssets()
	{
		list.Clear ();
		list.Add ("生物/动物");
		list.Add ("生物/动物/宠物/猫");
		list.Add ("生物/动物/宠物/狗");
//		list.Add ("生物/动物/野生/老虎");
//		list.Add ("生物/动物/野生/狮子");

		list.Add ("生物/植物");
		list.Add ("生物/植物/蔬菜/白菜");
		list.Add ("生物/植物/蔬菜/萝卜");
//		list.Add ("生物/植物/水果/苹果");
//		list.Add ("生物/植物/水果/橘子");
	
		Debug.Log ("获取数据完成");
	}

	private void CreateTree()
	{
		root = TreeNode.Get ().GenerateFileTree (list);
		Debug.Log ("生成文件树完成");
//		ShowFileTree (root, 0);
//		Debug.Log ("显示文件树完成");
	}


	private void ShowFileTree(TreeNode node, int level)
	{
		string prefix = "";
		for (int i = 0; i < level; i++)
		{
			prefix += "~";
		}
		Debug.Log (prefix + node.name);
		if (node == null || node.children == null) 
		{
			return;
		}
		for (int i = 0; i < node.children.Count; i++) 
		{
			ShowFileTree (node.children[i], level+1);
		}
	}


	private void DrawFileTree(TreeNode node, int level)
	{
		if (node == null) 
		{
			return;
		}
		GUIStyle style = new GUIStyle();
		style.normal.background = null;
		style.normal.textColor = Color.white;
		if (node == currentNode) 
		{
			style.normal.textColor = Color.red;
		}

		Rect rect = new Rect(5+20*level, 5+20*treeIndex, node.name.Length*25, 20);
		treeIndex++;

		if (node.nodeType == TreeNode.TreeNodeType.Switch) {
			node.isOpen = EditorGUI.Foldout (rect, node.isOpen, node.name, true);
		}
		else
		{
			if (GUI.Button (rect, node.name, style)) 
			{
				Debug.Log (node.name);
				currentNode = node;
			}
		}
	
		if (node==null || !node.isOpen || node.children == null) 
		{
			return;
		}
		for (int i = 0; i < node.children.Count; i++) 
		{
			DrawFileTree (node.children[i], level+1);
		}
	}

	void OnGUI()
	{
		treeIndex = 0;
		DrawFileTree (root, 0);
	}
}

效果图:


(点击后,被点击的节点红色显示,并在控制台输出被点击的节点的名字)


欢迎转载,转载请注明出处:http://blog.csdn.net/e295166319

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Unity3D 自定义树组件(树形菜单)

树组件在平时的开发中不常见,但是在某些场合下用树展示数据更加直观,比如在游戏中的展示任务数据,因为任务分很多类,所以这儿使用树就非常合适,NGUI 组件中并不存在树组件,毛主席说过:“自己动手,丰衣足...
  • e295166319
  • e295166319
  • 2016-08-29 11:17
  • 1822

Unity Editor 基础篇(二):自定义 Inspector 面板

本文参自:http://mp.weixin.qq.com/s/g7nClmQGPwU2o4yyBm6LcQ 本文为本人学习上连接的笔记有改动,请点击以上链接查看原文,尊重楼主知识产权。关于 Uni...
  • qq_33337811
  • qq_33337811
  • 2017-03-14 14:09
  • 4862

【Demo】UITableView实现分组可折叠下拉列表

前言UITableView作为UIKit中最重要的一个组件,应用还是很广泛很灵活的,它的特性用来实现分组列表再合适不过。可折叠分组列表最典型的是好友列表,是一个二级目录,点击每一个分组都会展开或折叠一...
  • cordova
  • cordova
  • 2016-11-05 18:41
  • 1934

Jq实现重叠效果-实现无限级分类树形中js 的折叠效果

案例: 代码实现: 首先,在静态页面导入jq包; 然后,代码实现如下: //获取当前的 a 标签 $('a.zd').click(functio...
  • u011341352
  • u011341352
  • 2015-08-04 09:01
  • 2060

【D3.js数据可视化系列教程】(二十九)--折叠树

折叠树
  • zhang__tianxu
  • zhang__tianxu
  • 2013-11-05 18:04
  • 10389

unity技术贴,包括地形构建、真实地行,遥感影像 、十字树制作、天空盒加载、角色控制器、树木、草地、河流湖泊制作、3dmax建筑制作,特效制作等等

  • 2016-06-06 10:58
  • 14.13MB
  • 下载

unity场景有关一些树和简单的花草

  • 2017-06-20 16:17
  • 16KB
  • 下载

Unity结构树

  • 2017-08-18 18:32
  • 20KB
  • 下载

Unity3D学习(14)之可折叠公告牌

最近越来越觉得Unity3D的UI很好玩,所以我尝试去制作可折叠的公告牌。先上个成品图: 首先新建Canvas,在Canvas里面新建两个Panel,一个Panel用于放置背景,一个Panel用于公...
  • zzj051319
  • zzj051319
  • 2017-05-07 11:33
  • 469

Unity学习(十三)场景优化之四叉树

http://blog.sina.com.cn/s/blog_89d90b7c0102wyfw.html 四叉树是在二维图片中定位像素的唯一适合的算法。因为二维空间(图经常被描述的方式)中,...
  • OnafioO
  • OnafioO
  • 2017-05-20 17:16
  • 837
    个人资料
    • 访问:230941次
    • 积分:3751
    • 等级:
    • 排名:第9983名
    • 原创:100篇
    • 转载:295篇
    • 译文:1篇
    • 评论:24条
    博客专栏
    最新评论