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

Unity中Drop()方法触发NullReferenceException的修复求助

修复拾取丢弃功能的NullReferenceException错误

问题根源

  • 多余分号导致逻辑错误:Physics.Raycast(...)语句末尾多了一个分号,使得if条件成为空语句,无论射线是否命中物体,后续代码块都会执行。若未命中,raycastHit.transform为null,会引发潜在错误。
  • 局部变量覆盖成员变量:在TryGetComponent时声明了局部的objectGrabbable,未给类的成员变量赋值。导致类内的objectGrabbable始终为null,执行丢弃操作时调用objectGrabbable.Drop()触发空引用异常。

修复后的PlayerPickUpDrop代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerPickUpDrop : MonoBehaviour
{
    [SerializeField] private Transform playerCameraTransform;
    [SerializeField] private Transform objectGrabPointTransform;
    [SerializeField] private LayerMask pickUpLayerMask;

    private ObjectGrabbable objectGrabbable;

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.E))
        {   
            if(objectGrabbable == null)
            {
                float pickUpDistance = 2f;
                // 移除Raycast语句末尾的分号
                if(Physics.Raycast(playerCameraTransform.position, playerCameraTransform.forward, out RaycastHit raycastHit, pickUpDistance, pickUpLayerMask))
                {
                    // 直接给成员变量赋值,不声明局部变量
                    if(raycastHit.transform.TryGetComponent(out objectGrabbable))
                    {
                        objectGrabbable.Grab(objectGrabPointTransform);
                    }
                } 
            }
            else 
            {
                objectGrabbable.Drop();
                Debug.Log("Nu");
                // 丢弃后将成员变量置空,确保下次可重新进入拾取逻辑
                objectGrabbable = null;
            }
        }
    }
}

额外说明

修复后,拾取物体时成员变量objectGrabbable会被正确赋值;丢弃操作执行后,需将该成员变量置为null,否则下次按下E键会直接进入丢弃分支,无法重新拾取新物体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:42:59