精华内容
下载资源
问答
  • TreeView.unitypackage

    2019-11-06 09:23:15
    Unity中经常使用的一个插件TreeView,可以制作树形UI,简单好用,
  • unityTreeView

    2018-07-08 15:42:03
    unitytreeview,可以自定义节点大小或统一节点大小 自定义介个或统一间隔
  • unity_treeview

    2017-01-06 14:35:36
    unity开发树形结构插件
  • unity 资源树插件
  • Unity官方插件TreeView

    2021-03-16 16:03:10
    TreeView是一个Unity UI控件,可以用来表示分层数据。TreeView实现了拖放,数据绑定,选择操作,是高度可定制的。还有两个基本类ItemsControl和ItemContainer,它们可以用来实现您自己的items控件。 特点: ♥数据...
  • Unity TreeView树形菜单

    2020-12-04 15:51:07
    Unity 树形菜单,TreeView组件,自定义的美化TreeView源码和对应demo,样式好看,对初学者是很好的学习资料,然后也可用于Unity项目中
  • Unity TreeView2

    2018-07-08 15:43:43
    唔,之前的Treeview感觉不太好用,所以。。又写了个代码在:https://download.csdn.net/download/qq_17813937/10528783每次改变节点状态都会从新计算节点坐标 private void UpdatePos(TreeItemData data, int index ...



    唔,之前的Treeview感觉不太好用,所以。。又写了个

    代码在https://download.csdn.net/download/qq_17813937/10528783

    每次改变节点状态都会从新计算节点坐标

        private void UpdatePos(TreeItemData data, int index = -1)
        {
            if (data != root)
            {
                if (data.target.gameObject.activeSelf)
                {
                    if (!(index == 0 && data.parent.id == 0))
                    {
                        if (index != 0) currentHeight += GetSpace(data);
                        else currentHeight += space;
                    }
                    data.target.localPosition = itemParent.localPosition - new Vector3(-data.indentLevel * indent - padding.x, currentHeight + padding.y);
                    currentHeight += GetHeight(data);
                }
            }
    
            int count = data.childs.Count;
            for (int i = 0; i < count; i++)
            {
                UpdatePos(data.childs[i], i);
            }
        }


    每次改变节点状态,都需要更新 conent的大小,以供滚动

        private void UpdateSize()
        {
            int count = items.Count;
            Vector2 max = Vector2.zero;
            for (int i = 0; i < count; i++)
            {
                if (!datas[i].isShow) continue;
                var tmp = items[i].transform as RectTransform;
    
                var size = new Vector2(tmp.localPosition.x, -tmp.localPosition.y) + tmp.sizeDelta;
    
                max.x = Mathf.Max(max.x, size.x);
                max.y = Mathf.Max(max.y, size.y);
            }
            conent.sizeDelta = new Vector2(max.x + padding.width, max.y + padding.height);
        }

    使用方式

    using UnityEngine;
    using UnityEngine.UI;
    
    public class Test : MonoBehaviour 
    {
        
    	private void Awake()
    	{
            var view = GetComponent<TreeView>();
            view.CustomsChildSize(0, new Vector2(200,30));
            view.CustomsSpace(0, 30);
    
            view.onClick = (item, isOpen) => {
                var target = item as CustomTreeItemData;
                target.toggle.isOn = isOpen;
                Debug.Log("点击了:"+item.name.text);
            };
    
            view.onHideItem = item => {
                var target = item as CustomTreeItemData;
                target.toggle.isOn = false;
            };
    
            view.onCreateItem = item => {
                if (item.childs.Count == 0)
                {
                    var target = item as CustomTreeItemData;
                    target.toggle.gameObject.SetActive(false);
                }
            };
    
    
            for (int i = 0; i < 10; i++)
            {
                view.AddData<CustomTreeItemData>(Random.Range(0,i), i, i.ToString());
            }
            view.Generate();
            view.AddItem<CustomTreeItemData>(9, 10, "666");
    	}
        
    }
    
    public class CustomTreeItemData:TreeItemData
    {
        public Toggle toggle;
    
        protected override void Init(Transform value)
        {
            toggle = target.GetComponentInChildren<Toggle>();
        }
    }


    展开全文
  • unity树状图插件TreeView

    2016-05-19 09:48:05
    unity树状图插件TreeView
  • unityTreeView

    千次阅读 2017-10-06 12:06:50
    public class TreeView : MonoBehaviour { public bool isFold = true; public GameObject prefab; public Sprite on; public Sprite off; public int indent; public int rowSpacing; public int ...


    使用方式见  http://blog.csdn.net/qq_17813937/article/details/78164638


    using UnityEngine;
    using UnityEngine.Events;
    using UnityEngine.UI;
    
    [RequireComponent(typeof(VerticalLayoutGroup))]
    [RequireComponent(typeof(ContentSizeFitter))]
    public class TreeView : MonoBehaviour {
    
        public bool isFold = true;
        public GameObject prefab;
        public Sprite on;
        public Sprite off;
        public int indent;
        public int rowSpacing;
        public int columnSpacing;
    
        private float left = 0;
        private TreeItem root;
        private RectTransform rectTransform;
    
        public class CreateEvent : UnityEvent<Transform> { }
        public CreateEvent onCreateItem = new CreateEvent();
    
        public RectTransform RectTransform
        {
            get
            {
                return rectTransform ?? (rectTransform = transform as RectTransform);
            }
        }
    
        private void Awake()
        {
            GetComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
            GetComponent<VerticalLayoutGroup>().spacing = rowSpacing;
        }
    
        public void Show()
        {
            gameObject.SetActive(true);
        }
    
        public void Hide()
        {
            gameObject.SetActive(false);
        }
    
        public TreeItem CreateItem(int id)
        {
            TreeItem item;
            if (on != null)
            {
                item = new TreeItem(prefab, true);
                item.SetIcon(on);
                if (left == 0)
                    left = item.IconSize.x + columnSpacing;
    
                item.Icon.rectTransform.anchoredPosition = new Vector2(-left, 0);
                item.ItemRectTr.anchoredPosition = new Vector2(left,0);
    
                if (isFold)
                {
                    EventListener.Get(item.Icon.gameObject).onLeftClick += () => {
                        if (item.IsOpenList) item.SetIcon(off);
                        else item.SetIcon(on);
                        item.IsOpenList = !item.IsOpenList;
                    };
                }
                item.HideIcon();
            }
            else
            {
                item = new TreeItem(prefab,false);
                if (isFold)
                {
                    EventListener.Get(item.ItemRectTr.gameObject).onLeftDoubleClick += () => {
                        item.IsOpenList = !item.IsOpenList;
                    };
                }
            }
            item.ItemRectTr.name = id.ToString();
            onCreateItem.Invoke(item.ItemRectTr);
            item.Parent = RectTransform;
            return item;
        }
    
        public void RootAddItem(TreeItem item)
        {
            if(root==null)
            {
                root = new TreeItem(null,false);
                root.ItemParent = RectTransform;
                root.index = -1;
            }
            AddItem(root, item);
        }
    
        public void AddItem(TreeItem parent, TreeItem child)
        {
            parent.AddItem(child);
            if(parent.Count > 0)
            {
                child.SetSiblingIndex(parent[parent.Count-1].GetSiblingIndex());
            }
            else
            {
                child.SetSiblingIndex(parent.GetSiblingIndex());
            }
            
        }
    
        public void UpdateIndent()
        {
            SetIndex(root);
        }
    
        private void SetIndex(TreeItem item)
        {
            int length = item.Count;
            for (int i = 0; i < length; i++)
            {
                var tmp = item[i];
                tmp.index = item.index+1;
                tmp.SetAnchoredPosition(new Vector2(left + tmp.index * indent, tmp.GetAnchoredPosition().y));
                SetIndex(item[i]);
            }
        }
    
        public void FoldAll()
        {
            int length = root.Count;
            if (on != null)
            {
                for (int i = 0; i < length; i++)
                {
                    root[i].Hide(off);
                }
            }
            else
            {
                for (int i = 0; i < length; i++)
                {
                    root[i].Hide();
                }
            }
        }
    }
    



    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class TreeItem{
        
        public int index;
        public  List<TreeItem> list = new List<TreeItem>();
    
        private bool isShowIcon = false;
        private bool isOpenList = true;
        private static Vector2 left = new Vector2(0, 0.5f);
        private RectTransform itemParent;
        private RectTransform item;
        private Image icon;
    
        public TreeItem this[int index]
        {
            get
            {
                return list[index];
            }
            set
            {
                list[index] = value;
            }
        }
    
        public Image Icon
        {
            get { return icon; }
        }
    
        public Vector2 IconSize
        {
            get { return icon.rectTransform.sizeDelta; }
        }
    
        public bool IsOpenList
        {
            get { return isOpenList; }
            set {
                if (value) Show();
                else Hide();
                isOpenList = value;
            }
        }
    
        public RectTransform ItemParent
        {
            get { return itemParent; }
            set { itemParent = value; }
        }
    
        public RectTransform ItemRectTr
        {
            get
            {
                return item;
            }
            set
            {
                item = value;
            }
        }
    
        public Transform Parent
        {
            set
            {
                itemParent.SetParent(value);
            }
        }
        
        public int Count
        {
            get
            {
                return list.Count;
            }
        }
    
        public TreeItem(GameObject prefab, bool showIcon)
        {
            if (prefab != null)
            {
                itemParent = new GameObject().AddComponent<RectTransform>();
                itemParent.pivot = left;
    
                item = GameObject.Instantiate(prefab).transform as RectTransform;
                itemParent.sizeDelta = item.sizeDelta;
                item.transform.SetParent(itemParent);
                item.anchorMin = left;
                item.anchorMax = left;
                item.pivot = left;
    
                if (showIcon)
                {
                    icon = new GameObject().AddComponent<Image>();
                    icon.rectTransform.anchorMin = left;
                    icon.rectTransform.anchorMax = left;
                    icon.rectTransform.pivot = left;
                    icon.transform.SetParent(item);
                }
            }
        }
        
        public void SetSiblingIndex(int index)
        {
            itemParent.SetSiblingIndex(index);
        }
    
        public int GetSiblingIndex()
        {
            return itemParent.GetSiblingIndex();
        }
    
        public void SetAnchoredPosition(Vector2 pos)
        {
            item.anchoredPosition = pos;
        }
    
        public Vector2 GetAnchoredPosition()
        {
            return item.anchoredPosition;
        }
    
        public void AddItem(TreeItem item)
        {
            if (icon!=null && !isShowIcon)
            {
                ShowIcon();
            }
            list.Add(item);
        }
        
        public void Show()
        {
            SetListActive(true);
        }
    
        public void Hide()
        {
            SetListActive(false);
        }
        
        public void SetIcon(Sprite sp)
        {
            icon.sprite = sp;
            icon.SetNativeSize();
        }
    
        public void Hide(Sprite sp)
        {
            SetListActive(sp, false);
        }
    
        public void Show(Sprite sp)
        {
            SetListActive(sp,true);
        }
    
        public void ShowIcon()
        {
            isShowIcon = true;
            icon.gameObject.SetActive(true);
        }
        
        public void HideIcon()
        {
            isShowIcon = false;
            icon.gameObject.SetActive(false);
        }
    
        private void SetListActive(bool active)
        {
            int length = list.Count;
            for (int i = 0; i < length; i++)
            {
                list[i].isOpenList = active;
                list[i].SetListActive(active);
                list[i].itemParent.gameObject.SetActive(active);
            }
            isOpenList = active;
        }
    
        private void SetListActive(Sprite sp, bool active)
        {
            int length = list.Count;
            for (int i = 0; i < length; i++)
            {
                list[i].isOpenList = active;
                list[i].SetIcon(sp);
                list[i].itemParent.gameObject.SetActive(active);
                list[i].SetListActive(sp, active);
            }
            isOpenList = active;
            SetIcon(sp);
        }
    }
    


    展开全文
  • treeview_01.unitypackage

    2019-05-28 10:23:43
    Unity3d UGUI 树形结构
  • unity3d TreeView Control

    热门讨论 2012-09-19 11:45:56
    unity3d中显示树形控件,代码可使用在Editor上,也可以使用在游戏场景中作为UI使用。
  • Unity菜单树 TreeView

    2021-03-22 21:21:57
    菜单树可以直接去Asset Store搜索TreeView,下载免费的那个 那么拿到菜单树之后,怎么将Json数据植入到我菜单树里面呢? 这就需要我们对Json文件做一些处理了。 既然称之为树,那么深度肯定是必不可少的东西,以根...

    今天说一下读取Json文件,生成菜单树。
    菜单树可以直接去Asset Store搜索TreeView,下载免费的那个
    就是这个

    那么拿到菜单树之后,怎么将Json数据植入到我菜单树里面呢?
    这就需要我们对Json文件做一些处理了。
    既然称之为树,那么深度肯定是必不可少的东西,以根节点深度0为基准,子节点深度为1,孙节点深度为2等。知道了每个节点的深度,还得知道父节点是谁,否则就是某个孙子知道自己有爷爷,但是不知道自己爷爷是谁了。
    有了父子关系和深度,那么就好办了
    首先根据Json数据计算出最大深度,这决定了我们要创建多少级菜单。
    直接上代码:

    	public struct MenuTree
    	{
    	    public string name;
    	    public string type;
    	    public float id;
    	    public float depth;
    	    public float parentId;
    	    public Color color;
    	    public string info;
    	    public string state;
    	    public string equipment;
    	    public string component;
    	    public FaultItem[] faultItem;
    	}
    	
        public static MenuTree[] LoadMenuTreeData(JsonData jd)
        {
            menuTreeDatas = new MenuTree[jd.Count];
            for (int i = 0; i < jd.Count; i++)
            {
                faultItems = new FaultItem[jd[i]["faultItem"].Count];
                for (int j = 0; j < jd[i]["faultItem"].Count; j++)
                {
                    faultItems[j].faultName = jd[i]["faultItem"][j]["faultName"].ToString();
                    faultItems[j].faultId =int.Parse(jd[i]["faultItem"][j]["faultId"].ToString());
                }
    
                menuTreeDatas[i].name = jd[i]["name"].ToString().TrimEnd();
                menuTreeDatas[i].type = jd[i]["type"].ToString().TrimEnd();
                menuTreeDatas[i].id = float.Parse(jd[i]["id"].ToString());
                menuTreeDatas[i].depth = float.Parse(jd[i]["depth"].ToString());
                menuTreeDatas[i].parentId = float.Parse(jd[i]["parentId"].ToString());
                menuTreeDatas[i].info = jd[i]["info"].ToString();
                menuTreeDatas[i].state = jd[i]["state"].ToString();
                menuTreeDatas[i].equipment = jd[i]["equipment"].ToString();
                menuTreeDatas[i].faultItem = faultItems;
            }
            return menuTreeDatas;
        }
        
        public static MenuTree[] LoadLocalMenuTree()
        {
            string ta = File.ReadAllText(Application.streamingAssetsPath + "/MenuTree.json");
            JsonData jd = JsonMapper.ToObject(ta.ToString());
            menuTreeDatas = LoadMenuTreeData(jd);
            return menuTreeDatas;
        }
        
        public static float GetMaxDepth()
        {
            MenuTree[] tmp = DataHandler.LoadLocalMenuTree();
            float maxDepth = tmp[0].depth;
    
            for (int i = 1; i < CV_DataHandler.LoadLocalMenuTree().Length; i++)
            {
                if (maxDepth < tmp[i].depth)
                    maxDepth = tmp[i].depth;
            }
    
            return maxDepth;
        }
    

    好的,获取到了最大深度,那么我们就可以大刀阔斧地干了,直接找到导入的Example脚本,挂载在空物体上,然后再添加TreeViewControl脚本,把所有你能看到的ParentControl变量都拖上去,然后修改Example脚本的PopulateExampleData方法:

     public static void PopulateExampleData(TreeViewControl item)
        {
            MenuTree[] tmp = DataHandler.LoadLocalMenuTree();
            item.Width = 260;
            item.Height = 1000;
            item.Header = "-1节点";//根节点的父节点,也可以直接作为根节点
    
            List<MenuTree> menuTree = tmp.ToList();
            float dep = DataHandler.GetMaxDepth();
            for (int i = 0; i <= dep; i++)
            {
                foreach (var it in menuTree)
                {
                    if (it.depth.Equals(i))
                    {
                        TreeViewItem tvitem = new TreeViewItem(null, null);//生成新的菜单项
                        float pd = it.parentId;//父物体ID
                        string _name = it.name;
                        if (pd < 0)//根节点没有父物体,父物体ID小于0就行
                            tvitem = item.RootItem.AddItem(_name);
                        else
                            tvitem = treeViewItemList.Find(x => x.ID.Equals(pd)).AddItem(_name);
                        tvitem.ID = it.id;
                        tvitem.equipmentName = it.equipment;
                        tvitem.myName = it.name;
                        AddEvents(tvitem);
                        treeViewItemList.Add(tvitem);
                        addName.Add(_name);
    
                    }
                }
            }
        }
    

    于是我们就能得到我们想要的效果了,其中TreeViewItem可以添加自己想要存储的变量,点击的时候可以获取这些变量。
    当我们敲代码的时候遇到某些逻辑问题难以捋清的时候,不妨试一试通过伪代码,或者直接一行一行先用文字述清每一步的逻辑,再回过头来,事情也许就能变的简单很多。
    周更,迟交一天,罪过

    展开全文
  • 5.5.0版本Open_csdn文章名为_Unity UGUI自定义树形菜单(TreeView) 解决“当把所有的二级菜单折叠后,再展开,本来属于第一个二级菜单的三级菜单的内容就会显示全部显示在最后一个二级菜单的尾部。”
  • Unity3d 编辑器 TreeView教程

    千次阅读 2017-05-25 15:40:58
    https://forum.unity3d.com/threads/new-treeview-api.447169/
    展开全文
  • Unity中实现TreeView

    千次阅读 2016-05-04 17:27:30
    Unity中要实现如下的树形状结构显示,是比较复杂的,相比于专门做二维的软件,效果也不咋样;但想想毕竟Unity主要是开发三维场景的工具,用来做二维界面确实有点可笑,但是也不是说不能实现,只要Unity有Image,那...
  • UnityEditor扩展之TreeView

    2020-01-06 14:03:08
    最简单的TreeView使用示例,...Unity TreeView 网络收包显示工具(Json版) 上面代码是对这个博文的例子的简化 树状图来显示Json很合适 TreeView Unity官方说明,其中的 示例代码 很丰富/实用,但有点复杂。
  • 用起来有一些规则,写个简单的案例以备查阅: using System.Collections.Generic;...using UnityEditor.IMGUI.Controls; using UnityEngine; public class MyTreeView : TreeView { //搜索控件 Searc...
  • Unity中的TreeView可以实现这样的效果: 或者这样的效果: TreeView可以实现hierarchy面板效果,元素可以进行点击、双击、重命名、拖拽、展开收起等效果(可以查看对应api)。 使用treeview,大概的结构如下...
  • \TreeView.xml " ); XmlElement rootElem = doc.DocumentElement; XmlNodeList itemlist = rootElem.GetElementsByTagName( " node " ); ItemList = new List (); foreach (XmlNode xn1 in itemlist)...
  • 可使用的Unity版本:5.5.X(已测试),2017.X(已测试),2018.X(已测试),2019.1(已测试) 截止至2019.07.16的最新版本,优秀的Unity可视化树形图组件,详情见开发文档。
  • Unity UGUI自定义树形菜单(TreeView

    万次阅读 热门讨论 2017-02-08 14:30:04
    先上几张效果图: 如果你需要的也是这种效果,那你就来对地方了! ...目前,我们这个树形菜单展现出来的功能如下: ...3、可以单独判断某一元素的复选框是否被勾选,或者直接获取当前树形菜单中所有被勾选的元素;...
  • AssetStore资源连接(含视频):https://assetstore.unity.com/packages/tools/gui/ugui-super-treeview-86571 PS:若发现资源版本与AssetStore不相符,请在下方评论区留言,我收到后会上传更新版本。
  • unity3d中显示树形控件,代码可使用在Editor上,也可以使用在游戏场景中作为UI使用。【csdn上有个下载需要16分的,和我这个一模一样的,大家别下这个16的了】

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
热门标签
关键字:

treeviewunity