obsidian/笔记文件/2.笔记/前缀树红点_第三章.md
2025-03-26 00:02:56 +08:00

4.0 KiB
Raw Permalink Blame History

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

!Pasted image 20240423120200.png

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

!Pasted image 20240423120539.png

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

!Pasted image 20240423120915.png

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

!Pasted image 20240423121654.png

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

!Pasted image 20240423121930.png

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

!Pasted image 20240423130121.png

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

!Pasted image 20240423130236.png

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

!Pasted image 20240423130623.png

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

!Pasted image 20240423131152.png

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

!Pasted image 20240423132035.png

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

!Pasted image 20240423132409.png

!Pasted image 20240423132439.png

!Pasted image 20240423132456.png

运行,表现正常

!Pasted image 20240423132559.png

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

!Pasted image 20240423133642.png

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

!Pasted image 20240423133830.png

!Pasted image 20240423134134.png