使用Trigger触发时遇“Object reference not set”错误的解决问询
Trigger脚本空引用错误排查与解决
问题场景
给玩家挂载Trigger脚本,逻辑如下:
- 进入带
Target标签对象的Trigger区域时,启用布尔值willGrab,可搬运该对象;通过other.transform.parent实现任意数量Target对象复用同一逻辑。 - 实际测试:5个同标签对象,进入其中一个的Trigger区域可正常搬运,退出后能自由进入其他(或同一)对象的Trigger区域操作;退出时Inspector中
mainObject变为None (Transform)符合预期,进入时会更新为对应对象。
报错问题
退出任意Trigger区域时,立即触发多条**"Object reference not set to an instance of an object"**空引用错误,定位到OnTriggerExit中的mainObject = null行。之前解决过该问题,现在忘了修改方式。
当前代码
Transform mainObject; public Transform MainObject { get { return mainObject; } } public void OnTriggerEnter(Collider other) { if (!other.CompareTag("Target")) return; willGrab = true; mainObject = other.transform.parent; } public void OnTriggerExit(Collider other) { if (!other.CompareTag("Target")) return; willGrab = false; mainObject = null; }
补充测试
完全移除mainObject = null行后,快速测试未出现错误,但不确定该做法是否妥当。
解决方案
直接移除mainObject = null的合理性
如果你的搬运逻辑完全由willGrab控制,且没有任何地方通过mainObject != null判断状态,移除该行确实能正常运行——因为willGrab设为false后,搬运逻辑会被阻断,不会操作无效对象。但这种做法存在隐患:后续扩展代码若依赖mainObject是否为null判断状态,会出现误判。
更稳妥的修正方式
- 精准匹配后再清空引用
在OnTriggerExit中,仅当退出的对象是当前搬运对象的子对象时,才清空mainObject,避免无关Target对象触发退出时错误清空引用:public void OnTriggerExit(Collider other) { if (!other.CompareTag("Target")) return; // 仅匹配当前正在搬运的对象时,才执行清空 if (mainObject != null && other.transform.IsChildOf(mainObject)) { willGrab = false; mainObject = null; } } - 在所有使用
mainObject的地方加空判断
无论是否清空mainObject,所有访问它的代码必须先做空引用检查,从根源避免报错:// 示例:搬运逻辑中的检查 if (willGrab && mainObject != null) { // 执行搬运操作 }
内容的提问来源于stack exchange,提问作者dangoqut132
相关产品推荐
相关产品推荐

