Unity中如何引用预制体脚本变量?实例化后空引用异常排查
解决Unity生成对象后访问组件变量的NullReferenceException问题
你的代码在if (OPScript.BoolVariable)触发空引用异常,本质是OPScript为null,导致无法访问它的BoolVariable属性。以下是核心原因和修复方案:
可能的原因
- ObjPrefab未挂载ObjPrefabScript组件:你实例化的是ObjPrefab的副本,如果原预制体本身没有挂载
ObjPrefabScript,GetComponent<ObjPrefabScript>()会返回null。 - ObjPrefab未在Inspector赋值:如果NewBehaviourScript1组件的
ObjPrefab字段是空的,Instantiate(ObjPrefab)会返回null,后续调用Obj.GetComponent()自然也拿不到组件。 - 组件在子物体上:如果
ObjPrefabScript挂载在预制体的子物体上,直接用GetComponent无法找到,需要改用GetComponentInChildren<ObjPrefabScript>()。
修复步骤
检查预制体组件:
打开你的ObjPrefab预制体,确认根物体或目标子物体上挂载了ObjPrefabScript脚本。如果是子物体,把获取组件的代码改成:OPScript = Obj.GetComponentInChildren<ObjPrefabScript>();确认预制体已赋值:
在Hierarchy中选中挂载NewBehaviourScript1的物体,在Inspector面板里把你的ObjPrefab拖到ObjPrefab字段中,确保Instantiate能正常生成对象。增加空值校验(关键):
不要直接在获取组件后就设置isGet = true,先判断是否获取成功,避免后续空指针。修改Update方法:void Update() { if (!isGet) { OPScript = Obj.GetComponent<ObjPrefabScript>(); // 只有成功获取到组件后,才标记isGet为true if (OPScript != null) { isGet = true; } } else { if (OPScript.BoolVariable) { Destroy(Obj); } } }额外优化:提前在Start中获取组件:
既然你在Start里已经实例化了Obj,完全可以直接在Start里获取组件,不用等到Update,减少逻辑冗余:void Start() { if (ObjPrefab != null) { Obj = Instantiate(ObjPrefab); OPScript = Obj.GetComponent<ObjPrefabScript>(); isGet = OPScript != null; } else { Debug.LogError("ObjPrefab未赋值!"); } }
内容的提问来源于stack exchange,提问作者Simone Bernardini
相关产品推荐
相关产品推荐

