Unity中按E键执行Raycast未命中时抛出NullReferenceException报错求助
问题根因
你的空引用报错是判断顺序写反导致的:你在未判断hit.collider是否为空的前提下,就直接调用了hit.collider.CompareTag()方法,当射线未命中任何物体时,hit.collider为null,直接访问它的方法自然会抛出空引用异常。
修复代码
把E键射线检测的逻辑替换为以下内容即可解决报错:
if (move) { if (Input.GetKey(KeyCode.E)) { Debug.DrawRay(transform.position + raypositionup, transform.up * 2f, Color.red); RaycastHit2D hit = Physics2D.Raycast(transform.position + raypositionup , transform.up, 2f); // 先判断是否命中物体,再执行后续操作 if (hit.collider != null) { if (hit.collider.CompareTag("Object")) { Debug.Log("Poop"); // 额外加空判断,避免命中的物体没有SpriteRenderer组件引发新的空引用 SpriteRenderer sr = hit.transform.GetComponent<SpriteRenderer>(); if (sr != null) { sr.color = Color.red; } } } } }
代码规范优化建议
- 变量命名统一规则:私有字段建议加小写下划线前缀,比如
_moveSpeed、_rb,公开的属性/字段用大驼峰,比如RayPositionUp,避免大小写混淆 - 序列化字段做补全校验:在Inspector面板赋值的
dialogueUI、animator等字段,建议增加空判断,避免忘记拖入资源引发空引用 - 射线检测指定层级:给可交互物体单独分配专属层级,射线检测时只扫描目标层级,既提升性能也不会出现误检测
- 布尔判断简化:
if (move == true)可以直接写为if (move),代码更简洁 - 魔法值提取为常量:射线长度2f、默认移动速度7f、冲刺速度10f这类固定数值,可以提取为
const常量,后续修改时只需要调整一处 - 组件获取加校验:
Start中获取Rigidbody2D后可以加一行Debug.Assert(rb != null, "当前物体未挂载Rigidbody2D组件"),开发阶段可以快速定位漏加组件的问题
内容的提问来源于stack exchange,提问作者Oxymoron
相关产品推荐
相关产品推荐

