CocosCreator全局消息事件

本文详细介绍了在CocosCreator中使用全局事件/消息中心 NotificationCenter 的实现方式,包括监听、触发和取消监听的方法,并强调了在节点销毁时移除监听的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的git有代码,如下:

NotificationCenter.ts

import { NotificationName } from "./NotificationName";

/**
 * CocosCreator's global Event/Message Center.
 */
export class NotificationCenter {
    private eventTarget: cc.EventTarget = new cc.EventTarget();

    private static instance: NotificationCenter = null;
    public static get Instance(): NotificationCenter {
        if (this.instance == null) {
            this.instance = new NotificationCenter();
        }
        return this.instance;
    }

    /**
     * Listen to a notification
     * @param name 
     * @param callback 
     */
    public on(name: NotificationName, callback: Function, target?: any) {
        this.eventTarget.on(name, callback, target);
    }

    /**
     * Dispatch a notification
     * @param name 
     */
    public emit(name: NotificationName, arg1?: any, arg2?: any, arg3?: any, arg4?: any, arg5?: any) {
        this.eventTarget.emit(name, arg1, arg2, arg3, arg4, arg5);
    }

    /**
     * Cancel listen
     * @param name 
     */
    public off(name: NotificationName, callback?: Function, target?: any) {
        this.eventTarget.off(name, callback, target);
    }
}


NotificationName.ts

export enum NotificationName {
    BattleOver = "BattleOver"
}

注意事项

对于非常驻监听,特别需要注意添加了监听后,在节点消除的时候需要删除监听。防止造成多重监听。

参考文档:
https://blog.youkuaiyun.com/qq_15020543/article/details/88672575
https://www.byjth.com/ccc/130.html

<think>好的,我需要回答用户关于Cocos Creator中如何实现事件派送和监听的问题。首先,我得回想一下Cocos Creator事件系统,记得主要有两种方式:节点事件全局事件。可能用户对这两者的区别不太清楚,需要分别解释。 然后,节点事件部分,应该提到使用on和emit方法,比如节点.on('事件名', 回调),然后通过emit触发。要举个例子,比如点击事件或者自定义事件。记得要说明参数传递,比如emit时可以传数据给回调函数。 接下来是全局事件,可能涉及到EventTarget类,比如cc.systemEvent.on和emit。这时候要提醒用户全局事件的使用场景,比如跨节点通信,同时也要注意事件名的唯一性,避免冲突。 还需要提到取消监听的重要性,比如off方法和once的使用,避免内存泄漏。可能用户会忘记取消监听,导致重复触发或者错误,这部分需要强调。 然后,应该比较一下节点事件全局事件的优缺点,帮助用户选择合适的方式。比如节点事件自动管理作用域,而全局事件需要手动处理,但更灵活。 另外,可能用户不太了解触摸事件和鼠标事件的具体实现,可以简单提一下,比如使用node.on(cc.Node.EventType.TOUCH_START, ...)这样的方式,或者通过系统事件来监听键盘输入。 最后,总结一下步骤,给出一个完整的示例,让用户能清楚看到从监听、派发到取消的整个流程。确保代码示例正确,使用中文注释,符合Cocos Creator的最新版本语法。 可能还需要提醒一些常见问题,比如事件名拼写错误,或者没有正确取消监听导致的问题。确保用户理解正确使用事件系统的重要性,以及如何避免潜在的错误。 现在需要把这些思路组织成结构化的回答,分点说明,保持语言简洁明了,适合不同层次的开发者理解。同时,检查是否有遗漏的重要点,比如事件冒泡或者捕获阶段,不过Cocos Creator默认不支持事件冒泡,可能需要说明或者忽略,根据用户的问题范围决定。 总之,回答要覆盖基本的事件监听和派发方法,区分节点和全局事件,提供示例代码,强调注意事项,帮助用户全面理解如何在Cocos Creator中使用事件系统。</think>在Cocos Creator中实现事件派送和监听主要有以下两种方式,我通过对比示例为你详细说明: 一、节点事件(作用域限定在节点层级) ```typescript // 监听事件(组件脚本中) this.node.on('score_changed', (event) => { cc.log(`收到分数变化:${event.detail}`) }, this); // 第三个参数指定回调上下文 // 派发事件 const event = new cc.Event.EventCustom('score_changed', true); event.detail = 100; this.node.dispatchEvent(event); // 取消监听(建议在onDestroy中执行) this.node.off('score_changed', this.callbackFunc, this); ``` 二、全局事件(跨节点通信) ```typescript // 注册全局监听 cc.systemEvent.on('GAME_OVER', this.onGameOver, this); // 派发全局事件 cc.systemEvent.emit('GAME_OVER', { score: 200 }); // 移除监听 cc.systemEvent.off('GAME_OVER', this.onGameOver, this); ``` 三、推荐实践: 1. 事件命名规范:使用全大写+下划线(如PLAYER_JUMP) 2. 优先使用节点事件处理局部交互 3. 使用once方法处理单次监听 ```typescript this.node.once('OPEN_DOOR', this.openDoorAction, this); ``` 4. 通过event.detail传递复杂数据 5. 重要事件建议使用枚举管理: ```typescript enum GameEvent { LEVEL_UP = "level_up", ITEM_COLLECTED = "item_collected" } ``` 四、系统内置事件类型: 1. 鼠标事件:cc.Node.EventType.MOUSE_DOWN 2. 触摸事件:cc.Node.EventType.TOUCH_START 3. 键盘事件:cc.SystemEvent.EventType.KEY_DOWN 注意事项: 1. 避免高频事件(每秒超过60次)影响性能 2. 被销毁节点会自动解除相关监听 3. 建议在组件onDestroy时手动移除全局监听 4. 使用事件派发器(EventTarget)可实现更复杂的事件系统 通过合理使用事件机制,可以实现组件间的松耦合通信,建议根据实际场景选择最合适的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iningwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值