Godot 4.2.2 Mono中[Tool]标签在Inspector运行异常求助
解决Godot编辑器中BlockManager.Instance空引用异常问题
问题分析
游戏运行时Chunk和Block管理器功能正常,但在编辑器Inspector中操作时触发BlockManager.Instance的NullReferenceException,无法预览编辑效果。已排除路径含特殊字符问题,原教程代码可正常运行,推测是Godot版本更新导致单例初始化逻辑不兼容。
核心原因
编辑器模式下,BlockManager单例未完成初始化,而Chunk在Inspector刷新时提前访问了Instance属性,导致空引用。Godot不同版本中,自动加载单例的编辑器初始化逻辑有调整,若未配置正确,编辑器模式下不会加载该单例。
修复方案
1. 配置编辑器兼容的自动加载单例
- 打开Godot项目设置,进入AutoLoad标签页
- 添加BlockManager脚本,务必勾选Load in Editor选项
- 该设置会让编辑器启动时就初始化BlockManager,保证
Instance在编辑器模式下不为空
2. 调整BlockManager的单例初始化逻辑
修改BlockManager代码,确保编辑器模式下也能正确赋值单例:
public class BlockManager : Node { public static BlockManager Instance { get; private set; } public override void _EnterTree() { if (Instance == null) { Instance = this; // 编辑器模式下防止单例被意外销毁 if (Engine.IsEditorHint()) { SetProcessMode(ProcessModeEnum.Always); DontDestroyOnLoad(this); } } else { QueueFree(); } } // 原有业务代码... }
3. 在Chunk中添加编辑器模式安全防护
修改Chunk中访问BlockManager.Instance的逻辑,避免编辑器模式下触发空引用:
public class Chunk : Node3D { public void RefreshChunk() { // 编辑器模式下先校验单例状态 if (Engine.IsEditorHint() && BlockManager.Instance == null) { GD.Print("编辑器模式下BlockManager未初始化,暂不执行刷新"); return; } // 原有Chunk刷新逻辑 var blockData = BlockManager.Instance.GetBlockData(blockType); // ... } }
验证步骤
- 重启Godot编辑器,确保AutoLoad设置生效
- 检查Chunk的Inspector面板,确认不再触发空引用异常
- 测试编辑器预览功能,验证Chunk编辑效果正常显示
内容的提问来源于stack exchange,提问作者Сергей Кондыков
相关产品推荐
相关产品推荐

