Skip to content

发射和监听事件

Cocos Creator 引擎提供了 EventTarget 类,用以实现自定义事件的监听和发射,在使用之前,需要先从 cc 模块导入,同时需要实例化一个 EventTarget 对象。

ts
import { EventTarget } from "cc";
const eventTarget = new EventTarget();

监听事件

监听事件可以通过eventTarget.on()接口来实现

ts
// 该事件监听每次都会触发,需要手动取消注册
eventTarget.on(type, func, target?);
  • type 为事件注册字符串

  • func 为执行事件监听的回调

  • target 为事件接受对象,不写就是当前对象

如果target没有设置,则回调里的this指向的就是当前执行回调的对象

ts
// 使用函数绑定
eventTarget.on(
  "foo",
  function (event) {
    this.enabled = false;
  }.bind(this)
);

// 使用第三个参数
eventTarget.on(
  "foo",
  (event) => {
    this.enabled = false;
  },
  this
);

除了用on监听, 我们还可以使用once接口.once监听在监听函数相应后就会关闭监听事件

取消监听事件

当我们不再关心某个事件时,我们可以使用 off 接口关闭对应的监听事件。

off接口的使用方式有以下两种:

ts
// 取消对象身上所有注册的该类型的事件
eventTarget.off(type);
// 取消对象身上该类型指定回调指定目标的事件
eventTarget.off(type, func, target);

注意

需要注意的是,off 方法的参数必须和 on 方法的参数一一对应,才能完成关闭。

  • 推荐如下方式:
ts
import { _decorator, Component, EventTarget } from "cc";
const { ccclass } = _decorator;
const eventTarget = new EventTarget();

@ccclass("Example")
export class Example extends Component {
  onEnable() {
    eventTarget.on("foobar", this._sayHello, this);
  }

  onDisable() {
    eventTarget.off("foobar", this._sayHello, this);
  }

  _sayHello() {
    console.log("Hello World");
  }
}

发射事件

发射事件可以通过eventTarget.emit()接口来实现

ts
// 发射事件
eventTarget.emit(type, arg1, arg2, ...);
  • type 为事件注册字符串

  • arg1, arg2 为事件参数

ts
eventTarget.emit("foobar", "arg1", "arg2");

发射和监听

ts
import { _decorator, Component, EventTarget } from "cc";
const { ccclass } = _decorator;
const eventTarget = new EventTarget();

@ccclass("Example")
export class Example extends Component {
  onLoad() {
    eventTarget.on("foo", (arg1, arg2, arg3) => {
      console.log(arg1, arg2, arg3); // print 1, 2, 3
    });
  }

  start() {
    let arg1 = 1,
      arg2 = 2,
      arg3 = 3;
    // At most 5 args could be emit.
    eventTarget.emit("foo", arg1, arg2, arg3);
  }
}
  • 注意

注意

这里传递参数不能超过 5 个