Event事件注册与分发

个人接触ccc事件并不长,通过看视频教程以及官方文档进行学习。
现在自己从零开始写一个游戏的时候,用到比较多的事件注册和分发,感觉事件注册和分发使用起来不是很方便,因为总是会在不同的地方注册事件,在不同的地方发送事件,所以在想能否统一注册、分发事件。
jQuery的事件注册与分发让我受到了启发,就心血来潮写了一个事件注册分发的工具,由于刚接触ccc不久,或许有更好的实现方式,到时还希望大家能够告诉我。
不多说,下面直接上代码:


 /**
  * 事件绑定
  *     func支持两种类型:
  *         1.func为函数,直接将此函数绑定到事件
  *         2.func为字符串,值必须为node上脚本组件中函数名,若同一node上有多个脚本组件,请保证该函数名唯一
  * @param targetNode 接收事件节点
  * @param eventType 事件类型
  * @param func 处理函数
  */
export function on(targetNode:cc.Node,eventType:string,func:Function|string) {
    if(func instanceof Function){
        targetNode.on(eventType,func);
    }else{
        let jsArray = targetNode.getComponents(cc.Component);
        if(jsArray){
            for (let i = 0; i < jsArray.length; i++) {
                const js = jsArray[i];
                if(js[func]){
                    targetNode.on(eventType,js[func].bind(js));
                    break;
                }
            }
        }
    }
}

 /**
  * 事件绑定(执行一次则删除)
  *     func支持两种类型:
  *         1.func为函数,直接将此函数绑定到事件
  *         2.func为字符串,值必须为node上脚本组件中函数名,若同一node上有多个脚本组件,请保证该函数名唯一
  * @param targetNode 接收事件节点
  * @param eventType 事件类型
  * @param func 处理函数
  */
 export function once(targetNode:cc.Node,eventType:string,func:Function|string) {
    if(func instanceof Function){
        targetNode.once(eventType,func);
    }else{
        let jsArray = targetNode.getComponents(cc.Component);
        if(jsArray){
            for (let i = 0; i < jsArray.length; i++) {
                const js = jsArray[i];
                if(js[func]){
                    targetNode.once(eventType,js[func].bind(js));
                    break;
                }
            }
        }
    }
}
/**
 * 关闭事件监听
 * @param targetNode 接收事件节点
 * @param eventType 事件类型
 * @param func 处理函数
 */
export function off(targetNode:cc.Node,eventType:string,func:Function|string){
    if(func instanceof Function){
        targetNode.off(eventType,func);
    }else{
        let jsArray = targetNode.getComponents(cc.Component);
        if(jsArray){
            for (let i = 0; i < jsArray.length; i++) {
                const js = jsArray[i];
                if(js[func]){
                    targetNode.off(eventType,js[func].bind(js));
                    break;
                }
            }
        }
    }
}

/**
 * 事件发送 emit
 *      事件处理函数接收参数为data
 * @param targetNode 接收事件节点
 * @param eventType 事件类型
 * @param data 自定义数据
 */
export function emit(targetNode:cc.Node,eventType:string,data:any) {
    targetNode.emit(eventType,data);
}

/**
 * 事件发送 dispatchEvent
 *      事件处理函数接收参数为cc.Event.EventCustom类型,可通过event.getUserData()获取自定义参数
 * @param targetNode 接收事件节点
 * @param eventType 事件类型
 * @param data 自定义数据
 */
export function dispatchEvent(targetNode:cc.Node,eventType:string,data:any) {
    let event = new cc.Event.EventCustom(eventType, true);
    event.setUserData(data);
    targetNode.dispatchEvent(event);
}