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

3.5 KiB
Raw Blame History

TreeNode树节点的构造函数有俩 前者是用于构建自身后者是用于配合传参完成父节点Parent的构建赋值 也会通过this的逻辑调用自身的Tree节点构建

!Pasted image 20240423105837.png

AddListener 和 RemoveListener 俩函数接口分别对应的是节点触发的Action回调对应的callback逻辑绑定和移除

!Pasted image 20240423110027.png

RemoveAllListener函数接口移除所有的节点监听逻辑就是把m_ChangeCallback这个Action功能回调null即可

!Pasted image 20240423112714.png

TreeNode树节点包含的InternalChangeValue函数接口通过对比当前自身Value节点值和传参newValue如果相等直接return就好 否则就重新设置Value节点值触发自身的m_ChangeCallback函数接口节点值修改回 再触发管理器的NodeValueChangeCallback修改回调是对应unity编辑器的显示参数修改后续会解析 最后再调用管理器的MarkDirtyNode函数接口把父节点Parent标记为脏节点 后续会解析跟随一起触发NodeValueChangeCallback节点修改回调函数

!Pasted image 20240423112822.png

AddChild函数接口是用于通过范围字符串RangeString类型的key添加对应该TreeNode的m_Children子节点集合 通过ContainsKey机制判断是否有重复添加 然后再TreeNode实例化一个新的TreeNode子节点对象其中Parent父节点设置为this自身即可 最后也会调用红点管理器的NodeNumChangeCallback函数回调触发编辑器的参数显示修改后续会解析

!Pasted image 20240423113754.png

获取子节点对应的是GetChild函数接口也就是从m_Children字典容器中TryGetValue提取即可

!Pasted image 20240423114302.png

RemoveChild函数接口也就是先GetChild获取到对应的子节点然后再Remove即可 需要注意的是移除子节点后自身this作为父节点会标记为脏节点后续进行节点变更的逻辑回调触发 也会调用管理器的NodeNumChangeCallback函数回调触发编辑器的参数显示修改

!Pasted image 20240423114458.png

RemoveAllChild函数接口是用于移除全部子节点直接调用clear即可然后也是把this自身标记为脏节点再触发NodeNumChangeCallback对应的编辑器参数膝盖回调 而ToString字符串的重写是输出节点自身对应的前缀树完整路径FullPath即可

!Pasted image 20240423115046.png

有一个GetOrAddChild函数接口是整合 GetChild 和 AddChild 函数接口逻辑上是判断child子节点是否存在如果不存在就通过AddChild函数接口完成子节点的添加即可

!Pasted image 20240423115412.png

修改节点值的是ChangeValue函数接口有两个重载前者是修改最末端的叶子节点需要判断m_Children子节点数据容器是否为空不为空就Exception抛出异常即可然后再调用之前解析过的InternalChangeValue函数接口把它对应的父节点标记为脏节点 后者是修改非叶子节点对应的节点值是foreach遍历最新的m_Children子节点数据容器中包含的节点值value叠加等于的sum总数再调用InternalChangeValue函数接口把它的父节点也设置为脏节点

!Pasted image 20240423115657.png