新手开发者求助:为何我的2D Raycast仅在鼠标处于游戏视图角落时生效?
问题分析与修正方案
核心问题:你直接使用的mousePosition是屏幕坐标(以游戏视图左下角为原点),并非相对于玩家的世界空间方向向量,导致射线的方向和长度逻辑完全错误。
以下是修正后的实现方案:
1. 关键修正步骤
- 将屏幕鼠标坐标转换为2D世界空间坐标
- 计算从玩家指向鼠标的单位方向向量(确保方向正确且长度归一化)
- 固定射线长度为1,完成射线检测与可视化
2. 完整修正代码
if (Input.GetMouseButtonDown(0)) { // 把鼠标屏幕坐标转成2D世界空间坐标(锁定z轴为0,适配2D场景) Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseWorldPos.z = 0; // 计算从玩家到鼠标的单位方向向量(长度固定为1) Vector2 rayDirection = (mouseWorldPos - playerRb.transform.position).normalized; float fixedRayLength = 1f; // 绘制固定长度的可视化射线(保留0.2秒方便观察) Debug.DrawRay(playerRb.transform.position, rayDirection * fixedRayLength, Color.red, 0.2f); // 发射长度为1的2D射线 RaycastHit2D hit = Physics2D.Raycast(playerRb.transform.position, rayDirection, fixedRayLength); if (hit.collider != null) { // 安全获取TreeScript组件,避免空指针报错 TreeScript targetTree = hit.transform.GetComponent<TreeScript>(); if (targetTree != null) { targetTree.treeHealth -= 1; } } }
3. 额外注意事项
- 确保你的主相机勾选了MainCamera标签,否则
Camera.main会返回空值;如果没设置标签,可以用FindObjectOfType<Camera>()替代(前者性能更优)。 - 检查树木对象的
Collider2D组件是否启用,且未被排除在射线检测图层外(Physics2D射线默认检测所有图层,可通过第四个参数自定义图层过滤)。
内容的提问来源于stack exchange,提问作者Business Cactus
相关产品推荐
相关产品推荐

