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

Unity 2D生存游戏开发:为何出现对象引用未设置实例错误?

空引用错误排查与修复方案

问题根源

你代码最后一行触发的Object reference not set to an instance of an object错误,本质是hit.transform.GetComponent<TreeScript>()返回了null——哪怕hit.collider不为空,也不代表这个物体上挂载了TreeScript脚本,直接访问treeHealth自然会报错。

具体修复步骤

  • 先确认树木的脚本挂载
    选中射线命中的树木物体,检查Inspector面板,确保它确实挂载了TreeScript,且treeHealth变量是公开的(public)或者加了[SerializeField]标签能在面板编辑。
  • 给组件访问加空值判断
    修改代码,先判断组件是否存在再操作,避免直接访问空引用:
    if (Input.GetMouseButtonDown(0))
    {
        Debug.DrawRay(transform.position, mousePosition * 0.1f, Color.red);
    
        RaycastHit2D hit = Physics2D.Raycast(playerRb.transform.position, mousePosition, 0.1f);
    
        if (hit.collider != null)
        {
            TreeScript treeScript = hit.transform.GetComponent<TreeScript>();
            if (treeScript != null)
            {
                treeScript.treeHealth -= 1;
            }
            else
            {
                Debug.LogWarning("命中的物体没挂TreeScript脚本!");
            }
        }
    }
    
  • 修正射线方向逻辑
    你直接用mousePosition(屏幕坐标)当射线方向是错的,得把鼠标位置转成世界空间的方向:
    if (Input.GetMouseButtonDown(0))
    {
        // 把屏幕鼠标坐标转成世界坐标
        Vector2 worldMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        // 计算从玩家到鼠标的射线方向
        Vector2 rayDir = worldMousePos - (Vector2)playerRb.transform.position;
        // 射线长度调大一点,0.1f太短可能碰不到树
        RaycastHit2D hit = Physics2D.Raycast(playerRb.transform.position, rayDir.normalized, 5f);
    
        Debug.DrawRay(playerRb.transform.position, rayDir.normalized * 5f, Color.red);
    
        if (hit.collider != null)
        {
            TreeScript treeScript = hit.transform.GetComponent<TreeScript>();
            if (treeScript != null)
            {
                treeScript.treeHealth -= 1;
            }
            else
            {
                Debug.LogWarning("命中的物体没挂TreeScript脚本!");
            }
        }
    }
    
    另外注意射线长度,原代码0.1f太短,大概率射不到树木,建议调大到合理数值(比如5f),同时确保树木有2D碰撞体(比如BoxCollider2D),且没勾选"Is Trigger"(除非你特意用触发检测)。
  • 检查playerRb是否赋值
    确认playerRb变量已经在Inspector面板中拖入了玩家的Rigidbody2D组件,避免playerRb.transform.position触发空引用。

内容的提问来源于stack exchange,提问作者Business Cactus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:45:31