在游戏运行时出现以下错误:
Cannot read properties of null (reading 'm_world')
TypeError: Cannot read properties of null (reading 'm_world')
at b2RigidBody2D.setActive
错误发生在创建地面燃烧区域时,RigidBody2D组件试图访问物理世界的m_world属性,但此时物理世界尚未完全初始化。
assets/scripts/CombatSystem/BulletEffects/GroundBurnArea.ts主要修改:
初始化时禁用RigidBody2D:
// 先禁用RigidBody2D组件,避免在物理世界未准备好时激活
const rigidBody = this.node.getComponent(RigidBody2D);
if (rigidBody) {
rigidBody.enabled = false;
}
增加延迟时间:
// 延迟设置碰撞器,确保物理系统已初始化
this.scheduleOnce(() => {
this.trySetupCollider();
}, 0.2); // 增加延迟时间到0.2秒
添加物理系统状态检查:
private trySetupCollider(): void {
// 检查物理系统是否已初始化
import { PhysicsManager } from '../../Core/PhysicsManager';
const physicsManager = PhysicsManager.getInstance();
if (!physicsManager) {
// 延迟重试
this.scheduleOnce(() => {
this.trySetupCollider();
}, 0.1);
return;
}
// ... 其他检查和设置
}
安全的RigidBody2D重新激活:
try {
rigidBody.type = ERigidBody2DType.Static;
rigidBody.enabledContactListener = true;
// 重新启用RigidBody2D组件
rigidBody.enabled = true;
} catch (error) {
// 错误处理和重试机制
}
assets/scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts主要修改:
创建前检查物理系统状态:
// 检查物理系统状态
import { PhysicsManager } from '../../Core/PhysicsManager';
const physicsManager = PhysicsManager.getInstance();
if (!physicsManager) {
console.warn('[GroundBurnAreaManager] 物理系统未初始化,无法创建燃烧区域');
return null;
}
const physicsSystem = physicsManager.getSystem();
if (!physicsSystem || !physicsSystem.enable) {
console.warn('[GroundBurnAreaManager] 物理系统未启用,无法创建燃烧区域');
return null;
}
如果问题仍然存在,请检查以下预制体配置:
RigidBody2D组件:
CircleCollider2D组件:
场景配置:
如果自动修复无效,可以尝试以下手动解决方案:
修复后,可以通过以下方式验证:
这次修复主要解决了物理系统初始化时机的问题,通过延迟激活RigidBody2D组件和添加状态检查,确保组件只在物理世界完全准备好后才被激活。这种方法既解决了当前的错误,又提高了系统的整体稳定性。