【Unity编辑器扩展】Tree View

Posted by LudoArt on May 23, 2022

【Unity编辑器扩展】Tree View

前言:在尝试做编辑器扩展的一些内容的时候,总是能遇到不少新鲜的概念,但这些东西总归是碎片化的。不能让碎片化的东西总是碎片下去,故新开一个系列记录一下接触的东西。

Tree View是一种IMGUI的概念,虽然名字里带有tree,却不是一种传统意义上的树形结构。其主要是用于显示一堆分层的数据。

Tree View的内容在 Unity的官方文档 中记录得非常详细了,同时Unity官方还给出了非常棒的几个Tree View示例

几个重要的概念

  • TreeViewState (TreeViewState) :包含在编辑器中与 TreeView 字段交互时更改的状态信息,例如选择状态、展开状态、导航状态和滚动状态。 TreeViewState 是唯一可序列化的状态。 TreeView 本身是不可序列化的——它是从它在构造或重新加载时所代表的数据中重建的。将 TreeViewState 作为字段添加到 EditorWindow 派生类中,以确保在重新加载脚本或进入播放模式时不会丢失用户更改的状态。
  • TreeViewItem (TreeViewItem) :包含有关单个 TreeView 项的数据,并用于在编辑器中构建树结构的表示。每个 TreeViewItem 必须使用唯一的整数 ID 构造(在 TreeView 中的所有项目中唯一)。 ID 用于在树中查找选择状态、展开状态和导航的项目。如果树表示 Unity 对象,请将每个对象的 GetInstanceID 用作 TreeViewItem 的 ID。在重新加载脚本或在编辑器中进入播放模式时,ID 用于 TreeViewState 以保持用户更改的状态。
  • BuildRoot (BuildRoot) :TreeView 类的单个抽象方法,必须实现才能创建 TreeView。使用此方法来创建树的根。每次在树上调用 Reload 时都会调用它。
    • 对于使用小数据集的简单树,在 BuildRoot 的根项下创建 TreeViewItems 的整个树;
    • 对于非常大的树,在每次重新加载时创建整个树并不是最优的。在这种情况下,创建根,然后重写 BuildRows 方法为仅当前行创建项目;
  • BuildRows (BuildRows) :一种虚方法,默认基于在 BuildRoot 中创建的完整树来构建行列表。如果只在 BuildRoot 中创建了根,则应重写此方法以处理展开的行。

image-20220530213054961

几个重要的功能

改名相关:CanRename(TreeViewItem item)RenameEnded(TreeView.RenameEndedArgs args)

拖拽相关:CanStartDrag(CanStartDragArgs args)SetupDragAndDrop(SetupDragAndDropArgs args)HandleDragAndDrop(DragAndDropArgs args)

点击相关:SelectionChanged(IList<int> selectedIds)SingleClickedItem(int id)DoubleClickedItem(int id)

右键点击相关:ContextClickedItem(int id)ContextClicked()