遇到个SystemEvent找不到回调事件后找不到节点的问题

1.addPrefab A
2.在A脚本里SystemEvent.on后emit正常
3.Destroy A
4.继续addPrefab A
5.在A脚本里再走一遍SystemEvent.on后emit报错this.node.xxx 是 null

解决方法是在OnDestroy里写上SystemEvent.off后问题解决
或者用SystemEvent.once也不会报错

现在只知道可能和引用计数有关,但是不知道为什么会这样
而且我很确定整个代码里没有第二个地方SystemEvent.on

这个SystemEvent是一个共享的对象,你不手动移除,那之前的注册还是会响应得

但Obj都没了难道事件不是自动销毁么

系统事件是注册在一个全局的地方,不依赖场景树的,所以就算节点被移除,事件的监听依然存在。 但是对于node.on的事件,事件在node本身的某个地方,事件的触发来自于场景树遍历时对事件的分发,所以节点没了,node.on的事件,就不会在场景树中被遍历到了,这种情况下才不需要移除监听。

1赞

举个更通俗的例子。 systemevent 就是 你交试卷给老师,你不在办公室了,老师依然可以批改你的卷子。 node.on 就像是随堂检查作业,你不在,自然老师批改不到你作业啦。

THX 66

请问我在A.JS里this.node.on
如何在B.JS里emit它?

我们都是自己实现一个事件派发系统,不受节点约束,这种网上一堆源码,因为cocos自带事件的只会向父节点方向传递,有局限性。用director做事件触发派发也勉强够用