如何修复Unity比较RaycastHit2D的tag时出现的空引用报错问题
问题根源
RaycastHit2D是值类型(结构体),本身永远不可能为null,你原有代码里的if (hit != null)判断永远为真,即使射线没有命中任何物体也会进入后续逻辑- 当射线未命中目标时,
hit.collider的值为null,直接访问它的tag属性就会触发空引用异常
修复方法
有两种常用修复写法:
方法1:显式判断collider是否存在
RaycastHit2D hit = Physics2D.Raycast(playerDetection.position, Vector2.right, sightDistance); // 先判断collider不为null再访问属性 if (hit.collider != null) { Debug.DrawRay(playerDetection.position, Vector2.right * sightDistance, Color.blue); // 推荐用CompareTag代替直接==tag,排查问题更方便 if (hit.collider.CompareTag("Player")) { animator.SetBool("isChasing", true); } }
方法2:利用RaycastHit2D的隐式布尔判断
Unity为RaycastHit2D重载了布尔转换运算符,只要射线命中了有效碰撞体就会返回true,写法更简洁:
RaycastHit2D hit = Physics2D.Raycast(playerDetection.position, Vector2.right, sightDistance); if (hit) { Debug.DrawRay(playerDetection.position, Vector2.right * sightDistance, Color.blue); if (hit.collider.CompareTag("Player")) { animator.SetBool("isChasing", true); } }
额外优化建议
尽量使用CompareTag()方法代替直接判断tag == "自定义标签":如果输入了不存在的标签名,Unity会抛出明确的标签不存在错误,比模糊的空引用异常更容易定位问题。
内容的提问来源于stack exchange,提问作者derpug
相关产品推荐
相关产品推荐

