回到,红点管理器ReddotMananger的脚本逻辑,其中的 AddListener 和 RemoveListener 函数接口,对应的,分别是,通过传参path路径索引,和callback 回调函数,完成TreeNode节点值的,节点值改变回调m_ChangeCallback,逻辑监听添加、移除

RemoveAllListener、ChangeValue、GetValue 仨函数接口,都是配合TreeNode节点的相关逻辑,分别完成:移除所有节点值、修改节点值、获取对应path的节点value值

红点管理器的,GetTreeNode函数接口,先判空传参path,然后从,所有节点的集合,m_AllNodes数据容器中,通过TryGetValue判断,是否已经,统一被管理; 如果获取到,就直接return 该node节点即可; 如果没有获取到,说明是要,创建新节点,或者之前创建过,该节点,但是没有被加入到,m_AllNodes数据容器,进行统一管理,走后续逻辑处理; TreeNode树节点cur,从Root根节点开始,length长度,是等于传参path字符路径的Length长度; 字符的开始索引startIndex,最开始设定为0开始计算;

继续,从开始索引开始,字符长度为终点,通过SplitChar分隔符,获取每个路径字段的key,再通过GetOrAddChild函数接口,不断获取,或构建,目标节点,和Root根节点之间的,其余节点

继续,最后一个节点,才加入到m_AllNodes节点数据容器,进行统一管理,期间其他创建出来的节点,是没有加入,统一管理的; 后续也不用重新创建,通过GetOrAddChild函数接口,也能get到,之前创建过的TreeNode节点;

管理器中,RemoveTreeNode 移除特定节点,和 RemoveAllTreeNode 移除所有节点,也是配合TreeNode的对应移除接口,完成移除即可

Update函数接口,对应的是轮询功能,实现的是,标记的脏节点,从哈希HashSet的m_DirtyNodes集合,放到,临时脏标记m_TempDirtyNodes,对应的队列容器,再遍历调用,其中元素的,ChangeValue函数即可

unity中,各个节点,都是使用ReddotUI脚本,处理逻辑

ReddotUI逻辑本体,继承自IPointerClickHandler,会包含,点击触发逻辑,声明Path,是作为TreeNode节点管理,对应的key,而txt的UI控件,就是用来显示,当前红点数值,在Awake函数,完成组件获取,初始化即可

Start开始函数,完成Node节点的构建添加、和触发回调,ReddotCallback函数的监听添加; 而ReddotCallback函数接口,对应的是,节点值修改,触发回调,在unity打印log,修改txt文本内容即可; 而OnPointerClick函数接口,对应的,就是点击逻辑,设定上,左键点击,调用value + 1,节点值加1,而右键点击,调用value - 1,节点值减1;

几个节点的Path节点路径,用/作为分隔符,递进表现

运行,表现正常

对应红点的编辑器逻辑,会使用IMGUI,树状结构TreeViewItemTreeView的逻辑和机制; ReddotTreeViewItem红点树条目,是继承自TreeViewItem,其中声明了TreeNode节点变量m_node,还有与之对应的获取/设置器,节点路径Path,节点值value;

构造函数,就是完成各声明变量的,初始化,还有一个id的赋值,是父类TreeViewItem自带的id; 而节点显示名称的displayName函数接口重写,就是基于TreeNode的节点名称、节点值、子节点数目,几个参数,完成构建即可;