Unity2D射线投射指向错误目标:射线未跟随鼠标而是径直向前
问题原因
你混用了3D射线与2D射线API。Camera.main.ScreenPointToRay返回的是3D空间的射线,方向基于3D相机坐标系;而Physics2D.Raycast需要的是2D平面内的方向向量,直接套用3D射线方向会导致射线偏离鼠标指向。
解决方案
根据你的相机类型选择对应修正方式:
情况1:使用正交相机(Orthographic)
正交相机下,先将鼠标位置转换为世界坐标,再计算从发射点到鼠标位置的2D方向:
void Update() { if (Input.GetMouseButtonDown(0)) { CastRay(); } } void CastRay() { // 将鼠标屏幕坐标转为世界坐标,z值设为相机z值以对齐2D平面 Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseWorldPos.z = Camera.main.transform.position.z; // 计算归一化的2D射线方向(从当前物体指向鼠标) Vector2 rayDirection = (mouseWorldPos - transform.position).normalized; // 发射2D射线 RaycastHit2D hit = Physics2D.Raycast(transform.position, rayDirection, Mathf.Infinity); if (hit.collider != null) { Debug.Log(hit.collider.gameObject.name); } }
情况2:使用透视相机(Perspective)
透视相机下,用Physics2D.GetRayIntersection将3D射线转换为2D平面的有效检测:
void Update() { if (Input.GetMouseButtonDown(0)) { CastRay(); } } void CastRay() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 直接检测3D射线与2D碰撞体的交点 RaycastHit2D hit = Physics2D.GetRayIntersection(ray, Mathf.Infinity); if (hit.collider != null) { Debug.Log(hit.collider.gameObject.name); } }
额外注意事项
- 确认射线发射点(示例中为
transform.position)是正确的2D物体位置,若从相机发射则替换为Camera.main.transform.position - 检查场景中2D碰撞体是否正确添加,且
Physics2D碰撞矩阵中已启用对应层的检测
内容的提问来源于stack exchange,提问作者Zero
相关产品推荐
相关产品推荐

