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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:27:02