获取鼠标位置时触发RayCast相关NullReferenceException错误求助
解决Unity空引用错误(NullReferenceException)
你的报错指向DragBlock.Update()第13行,核心原因及修复方案如下:
直接触发错误的原因:Camera.main为空
第13行Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);中,Camera.main返回了null,通常是因为主相机未设置MainCamera标签。
修复方法:
- 编辑器中选中主相机,在Inspector的Tag下拉菜单选择
MainCamera(无此标签则新建); - 更可靠的方式是直接引用相机组件,避免动态查找:
using UnityEngine; public class DragBlock : MonoBehaviour { [SerializeField] private Camera mainCamera; // Inspector面板拖入主相机 private bool isBeingHeld = false; private Vector3 startPos; private Transform heldObject; private void Update() { if (Input.GetMouseButton(0)) { Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if (hit.transform.CompareTag("Blocks")) { isBeingHeld = true; startPos = hit.transform.position; heldObject = hit.transform; } } } if (isBeingHeld && heldObject != null) { Vector3 currentMousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition); currentMousePos.z = heldObject.position.z; heldObject.position = currentMousePos; } if (Input.GetMouseButtonUp(0)) { isBeingHeld = false; heldObject = null; } } }
潜在空引用风险修复
即使解决了相机问题,若isBeingHeld为true但heldObject未赋值(比如异常流程),访问heldObject.position仍会报错。修复方式:
- 在使用
heldObject前增加空值判断(如上代码中的isBeingHeld && heldObject != null); - 鼠标抬起时重置
heldObject为null,避免残留无效引用。
额外检查点
- 确保带
Blocks标签的物体有Collider组件(如BoxCollider),否则射线无法检测到; - 检查物体所在层级,确保不在
Ignore Raycast层级上。
内容的提问来源于stack exchange,提问作者Games Dark
相关产品推荐
相关产品推荐

