背景
在游戏开发中,常常需要处理复杂的数据交互和事件响应,尤其是在组件化的环境中。为了实现这种需求,我们需要一个高效的事件调度系统来处理数据变化和节点状态。Cocos Creator 作为一个流行的游戏引擎,提供了丰富的组件系统和事件机制,但开发者有时需要自定义更灵活的解决方案。
StData
模块
StData
模块负责数据的存取、监听以及清理操作。它使用了一种基于路径的存储方式来管理数据,并通过事件调度器来处理数据变化的通知。
- 获取数据:
get(path: string, dv?: any)
- 根据路径从缓存中获取数据,如果路径不存在则返回默认值。
- 设置数据:
set<T>(path: string, v: T, ignoreEvent?: boolean)
- 根据路径设置数据,并可选择是否触发事件。
- 监听数据变化:
listen(path, node, func)
- 监听数据的变化,并在数据改变时调用指定的回调函数。
- 取消监听:
unlisten(path, node)
- 取消对某个数据路径的监听。
- 清除数据:
clear()
- 清空所有缓存的数据
Datar
模块
Datar
命名空间封装了对 StData
模块的操作,提供了一些便捷的接口来简化数据管理工作。它的功能包括:
- 获取数据:
get<T extends keyof DatarList>(key: T): DatarList[T]
- 设置数据:
set<T extends keyof DatarList>(key: T, value: DatarList[T]): void
- 监听数据:
listen<T extends keyof DatarList>(key: T, node: Node, call: (value: DatarList[T]) => void): void
- 取消监听:
unlisten<T extends keyof DatarList>(key: T, node: Node): void
- 监听数据:
listenget<T extends keyof DatarList>(key: T, dv: any, node: Node, call: (value: DatarList[T]) => void): void
- 相比
listen
有以下特点- 除了设置监听器,还会立即获取当前数据的值,并将其作为参数传递给回调函数
- 如果路径不存在,使用提供的默认值
dv
- 适合于需要在注册监听的同时获取数据当前值的场景,比如在初始化时需要先展示当前数据,然后再处理后续的变化
- 相比
示例
1 | import { Datar } from "./Datar"; |
stEventDispatcher
模块
stEventDispatcher
类是事件调度系统的核心,负责管理事件的绑定、派发以及清理。它支持节点之间的事件传递,并在节点销毁时自动清理相关事件。
添加事件监听:
listen(eventName: string, func: EventFunc)
- 注册一个事件监听函数。
移除事件监听:
removeEventFuncs(eventName: string)
- 移除指定事件的所有监听函数。
分发事件:
dispatch(eventName: string, ...datas)
- 分发事件给所有注册的监听函数。
管理子事件调度器:
addChild(disp: stEventDispatcher)
和removeChild(disp:stEventDispatcher)
- 添加和移除子事件调度器,以支持复杂的事件结构。
DestroyOb
模块
DestroyOb
组件用于管理 Cocos Creator 节点的生命周期,确保在节点销毁时清理相关资源和事件监听器。
获取组件实例:
getCom(node: Node): DestroyOb
- 获取指定节点上的
DestroyOb
组件实例,如果不存在则添加一个新的。
- 获取指定节点上的
监听销毁事件:
listen(func: Function, node?: Node)
- 注册一个回调函数,以在节点销毁时触发。
获取源码
Datar.ts
1 | import { StData } from "./StData"; |
StData.ts
1 | import { stEventDispatcher } from "./StEventDispatcher" |
StEventDispatcher.ts
1 | import { StDestroy } from "./DestroyOb" |
DestroyOb.ts
1 | import { stEventDispatcher } from "./StEventDispatcher"; |