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
相关产品推荐
相关产品推荐

