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

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>()。

修复步骤

  1. 检查预制体组件:
    打开你的ObjPrefab预制体,确认根物体或目标子物体上挂载了ObjPrefabScript脚本。如果是子物体,把获取组件的代码改成:

    OPScript = Obj.GetComponentInChildren<ObjPrefabScript>();
    
  2. 确认预制体已赋值:
    在Hierarchy中选中挂载NewBehaviourScript1的物体,在Inspector面板里把你的ObjPrefab拖到ObjPrefab字段中,确保Instantiate能正常生成对象。

  3. 增加空值校验(关键):
    不要直接在获取组件后就设置isGet = true,先判断是否获取成功,避免后续空指针。修改Update方法:

    void Update()
    {
        if (!isGet)
        {
            OPScript = Obj.GetComponent<ObjPrefabScript>();
            // 只有成功获取到组件后,才标记isGet为true
            if (OPScript != null)
            {
                isGet = true;
            }
        }
        else
        {
            if (OPScript.BoolVariable)
            {
                Destroy(Obj);
            }
        }
    }
    
  4. 额外优化:提前在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:03:24