- 版本3.8.1
- 2d项目, box2d物理引擎
- 问题步骤:给一个node添加了 BoxCollider2D 组件, 但不添加 RigidBody2D 组件,那么当有其他node和该node的碰撞体发生碰撞时,就会出现 “Cannot read property ‘enabledContactListener’ of null”的报错,有如下的调用栈:

但是这样的报错没有提供有效信息共开发者进行问题查找。
问了尝试解决这问题,我需要修改编辑器的 C:\ProgramData\cocos\editors\Creator\3.8.1\resources\resources\3d\engine\bin.cache\dev\editor\bundled\index.js:214466, 在这周围打断点:
if(!bodyA){
console.error("invalid body:", colliderA)
}
if (bodyA.enabledContactListener) {
colliderA === null || colliderA === void 0 ? void 0 : colliderA.emit(contactType, colliderA, colliderB, this);
}
if(!bodyB){
console.error("invalid body:", colliderB)
}
if (bodyB.enabledContactListener) {
colliderB === null || colliderB === void 0 ? void 0 : colliderB.emit(contactType, colliderB, colliderA, this);
}

我才能知道可能时哪个节点出现了问题,但我觉得这部分工作是引擎可以做的,需要开发者折腾到引擎代码,那说明这个引擎不够健壮,并非对开发者友好。
随然在官方文档里有这么个约束性描述:

但是文档性的约束时不可靠的,一是开发者未必就看文档,二是需要通过严格性的读文档来进行开发的软件本身就不是优秀的代码,我梦想中的优秀软件是“自说明”的,就是在编辑器编辑是就应该明确知道这里就是缺少了个rigibody;什么是“自说明”, 举个写代码的例子:magic number、幻数就不是自说明,
let a = 3 不是自说明的,鬼知道a是什么意思,需要读者读取上下文才知道是什么意思; let hp = 3 是自说明的,hp就是血量。
建议:既然要求有colliderbox就必须有rigibody组件时,那就在编辑器保存时做个检测,通过警告告知开发者不就行了吗?这个远比文档强。