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

Unity脚本出现NullReferenceException:Awake赋值后WindowFunction变量为空

解决Unity中Awake赋值后WindowFunction里变量为空的NullReferenceException问题

兄弟,我太懂你这种糟心的情况了!明明Awake里把变量都妥妥赋值好了,结果一调用WindowFunction就触发空引用,变量全变成null,这事儿我之前踩过坑,大概率是这几个原因,咱们一步步排查解决:

  • 检查WindowFunction的绑定与脚本实例是否统一
    Unity的GUI.Window需要绑定当前脚本实例的成员方法,如果你的调用方式有问题,或者脚本存在多个实例,就会出现“Awake在A实例赋值,WindowFunction在B实例执行”的情况。
    你可以先在Awake和WindowFunction里加日志,打印实例ID确认是不是同一个对象:

    void Awake()
    {
        Debug.Log($"Awake执行,实例ID: {this.GetInstanceID()}");
        // 你的变量赋值代码
    }
    
    void WindowFunction(int windowID)
    {
        Debug.Log($"WindowFunction执行,实例ID: {this.GetInstanceID()}");
        // 你的窗口逻辑
    }
    

    如果两个ID不一样,说明存在多个脚本实例,要么删掉多余的挂载,要么改成单例模式确保全局只有一个实例。

  • 确认变量初始化的完整性
    你提到的BSpace和二维数组string[][],会不会是在Awake里只做了部分初始化?比如二维数组只声明了外层数组,没初始化内部的子数组:

    // 错误示例:只初始化外层,子数组还是null
    myStringArray = new string[3][];
    // 正确做法:还要初始化每个子数组
    for (int i = 0; i < myStringArray.Length; i++)
    {
        myStringArray[i] = new string[5];
    }
    

    虽然你说Awake里正常,但还是可以加日志确认变量在Awake结束时的状态,排除初始化不彻底的问题。

  • 排查脚本是否被意外销毁/重建
    比如场景切换、动态加载卸载物体时,脚本实例被销毁,但GUI.Window的回调还在触发,这时候访问变量自然是空的。可以加OnDestroy日志看看脚本是不是被意外销毁了:

    void OnDestroy()
    {
        Debug.Log($"脚本实例被销毁,ID: {this.GetInstanceID()}");
    }
    

靠谱的解决示例(单例模式确保实例统一)

如果是多实例导致的问题,改成单例模式就能彻底解决,参考代码:

public class MyWindowScript : MonoBehaviour
{
    private static MyWindowScript _instance;
    private Rect windowRect = new Rect(0, 0, Screen.width, Screen.height);
    public Vector2 scrollPosition = Vector2.zero;
    private int BSpace;
    string[][] myStringArray;

    void Awake()
    {
        // 确保全局只有一个实例
        if (_instance != null && _instance != this)
        {
            Destroy(this.gameObject);
            return;
        }
        _instance = this;
        DontDestroyOnLoad(this.gameObject);

        // 完整初始化变量
        BSpace = 10;
        myStringArray = new string[3][];
        for (int i = 0; i < 3; i++)
        {
            myStringArray[i] = new string[5];
            // 给子数组赋值内容
        }
    }

    void OnGUI()
    {
        // 确保只有单例实例执行GUI逻辑
        if (_instance != this) return;
        windowRect = GUI.Window(0, windowRect, WindowFunction, "我的自定义窗口");
    }

    void WindowFunction(int windowID)
    {
        // 这里的变量就不会再为空了
        scrollPosition = GUI.BeginScrollView(new Rect(10, 30, windowRect.width - 20, windowRect.height - 40), scrollPosition, new Rect(0, 0, 500, 800));
        // 绘制你的窗口内容
        GUI.Label(new Rect(10, 10, 200, 20), $"BSpace的值: {BSpace}");
        GUI.EndScrollView();
        GUI.DragWindow();
    }
}

内容的提问来源于stack exchange,提问作者Oscar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:42:53