Unity中销毁GameObject报错求助:交互文本销毁后控制台持续报错
问题分析与解决方案
报错原因
你调用Destroy(openDrawer, 1f)销毁交互文本对象后,后续每帧的Update方法里依然在执行openDrawer.SetActive(true)或openDrawer.SetActive(false)——但此时openDrawer已经被销毁,引用变为null,所以会持续抛出空引用异常。
修复方案
不要直接销毁交互文本,而是通过激活状态控制显示,或者添加状态标记避免重复触发:
方案1:用SetActive替代Destroy(推荐)
保留交互文本对象,通过开关激活状态控制显示,这样既解决文本残留问题,又不会出现空引用:
[SerializeField] private Animator OpenDrawer; [SerializeField] private Animator OpenKey; public GameObject openDrawer; public float interactionDistance = 10f; private bool isDrawerOpened = false; // 标记抽屉是否已打开 void Update () { RaycastHit hit; Debug.DrawRay(transform.position, transform.forward * interactionDistance, Color.black); if(Physics.Raycast(transform.position, transform.forward, out hit, interactionDistance)) { if (hit.transform.tag == "DESK" && !isDrawerOpened) { openDrawer.SetActive(true); if (Input.GetKeyDown(KeyCode.O)) // 改用GetKeyDown避免持续触发 { openDrawer.SetActive(false); // 直接隐藏文本 isDrawerOpened = true; // 标记抽屉已打开,不再显示交互文本 OpenDrawer.SetBool("OpenDrawer", true); OpenKey.SetBool("OpenKey", true); } } } else { if(!isDrawerOpened) // 抽屉未打开时才隐藏文本 { openDrawer.SetActive(false); } } }
方案2:必须销毁时添加空检查
如果一定要销毁文本对象,每次访问前必须检查对象是否存在,避免空引用:
[SerializeField] private Animator OpenDrawer; [SerializeField] private Animator OpenKey; public GameObject openDrawer; public float interactionDistance = 10f; private bool isDrawerOpened = false; void Update () { RaycastHit hit; Debug.DrawRay(transform.position, transform.forward * interactionDistance, Color.black); if(Physics.Raycast(transform.position, transform.forward, out hit, interactionDistance)) { if (hit.transform.tag == "DESK" && !isDrawerOpened && openDrawer != null) { openDrawer.SetActive(true); if (Input.GetKeyDown(KeyCode.O)) { Destroy(openDrawer, 1f); isDrawerOpened = true; OpenDrawer.SetBool("OpenDrawer", true); OpenKey.SetBool("OpenKey", true); } } } else { if(openDrawer != null && !isDrawerOpened) { openDrawer.SetActive(false); } } }
额外提示
- 用
Input.GetKeyDown替代Input.GetKey,避免按住O键时持续执行动画和销毁逻辑。 - 状态标记
isDrawerOpened可以避免抽屉打开后,再次指向桌面时重复触发交互提示。
内容的提问来源于stack exchange,提问作者Mohammed - Student
相关产品推荐
相关产品推荐

