Files
heros/assets/script/game/hero/EBusComp.ts

90 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { _decorator, EventTarget } from 'cc';
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
const { ccclass } = _decorator;
/** 事件总线组件 - 简化版,仅提供基本的发布订阅功能 */
@ecs.register('EBusComp', false)
export class EBusComp extends CCComp {
/** 内部事件目标 */
private _eventTarget: EventTarget;
/** 获取事件目标 */
private get eventTarget(): EventTarget {
if (!this._eventTarget) {
this._eventTarget = new EventTarget();
}
return this._eventTarget;
}
start() {
// 组件启动时的初始化逻辑
}
/**
* 发布事件
* @param event 事件名称
* @param data 事件数据
*/
public emit(event: string, data?: any): void {
this.eventTarget.emit(event, data);
}
/**
* 订阅事件
* @param event 事件名称
* @param callback 回调函数
* @param target 回调函数的this指向
*/
public on(event: string, listener: (...args: any[]) => void, object?: any): void {
this.eventTarget.on(event, listener, object);
}
/**
* 取消订阅事件
* @param event 事件名称
* @param callback 回调函数
* @param target 回调函数的this指向
*/
public off(event?: string, callback?: (data?: any) => void, target?: any): void {
if (arguments.length === 0) {
// 无参调用:清理本节点所有监听
this.eventTarget.targetOff(this);
} else if (arguments.length === 1) {
// 仅提供 event清理该事件名下所有回调
this.eventTarget.targetOff(event);
} else {
// 完整参数:精确移除指定回调
this.eventTarget.off(event!, callback!, target);
}
}
/**
* 订阅一次性事件
* @param event 事件名称
* @param callback 回调函数
* @param target 回调函数的this指向
*/
public once(event: string, callback: (data?: any) => void, target?: any): void {
this.eventTarget.once(event, callback, target);
}
/**
* 取消所有事件监听
*/
public targetOff(target: any): void {
this.eventTarget.targetOff(target);
}
reset() {
// 清理所有事件监听
if (this._eventTarget) {
this._eventTarget.targetOff(this);
}
// 组件删除时触发自定义释放逻辑
this.node.destroy();
}
}