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

新手开发者求助:为何我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:05:17