You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Сергей Кондыков

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:58:15