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
相关产品推荐
相关产品推荐

