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

Unity2D中带线条显示的枪械射线检测:无碰撞时终点计算错误求助

搞定Unity 2D射线未命中时的终点计算问题

嘿,我来帮你解决这个射线显示的问题!你的代码里其实藏着两个关键小错误,导致未命中时线条方向不对、长度异常,咱们一步步来修正:

问题出在哪?

  1. 射线检测的方向传错了
    Physics2D.Raycast的第二个参数需要的是方向向量,不是鼠标的世界位置哦!你现在直接传mousePos,相当于把鼠标坐标当成了射线的方向,这肯定会让射线跑偏的。

  2. 未命中时的终点逻辑搞反了
    你用(transform.position - mousePos).normalized得到的是从鼠标指向玩家的方向,再乘以-1 * (distance / 2)不仅方向完全反了,长度还只用到了最大距离的一半,难怪线条会不对啦。

修正后的完整代码

// 获取鼠标在世界空间中的位置(2D场景下把z轴设为0)
Vector3 mousePos = CameraController.mouseToWorld(Input.mousePosition);
mousePos.z = 0;

// 算出从玩家指向鼠标的方向向量
Vector3 shootDirection = mousePos - Player.transform.position;

// 正确执行射线检测:起点是玩家位置,方向是归一化后的射击方向,最大距离是设定的distance
RaycastHit2D hit = Physics2D.Raycast(Player.transform.position, shootDirection.normalized, distance);

if (hit.collider != null) {
    PassTheHit(hit, hit.collider.gameObject.name);
    point = hit.point;
} else {
    // 未命中时,计算射线的最远终点:玩家位置 + 归一化方向 × 最大距离
    point = Player.transform.position + shootDirection.normalized * distance;
    point.z = 0f;
}

为啥这样改就对了?

  • 射线方向修正:用mousePos - Player.transform.position拿到的是玩家指向鼠标的正确方向,归一化后传入Raycast,保证射线沿着你想要的方向发射。
  • 未命中终点计算:以玩家位置为起点,加上“归一化的射击方向 × 最大射程”,这样得到的就是射线在最远能到达的位置,方向和长度都完全符合预期,线条自然就正常渲染啦。

这样调整后,不管射线有没有命中目标,你的射击线条都能准确显示:命中时停在碰撞点,没命中时就显示到最大射程的终点~

内容的提问来源于stack exchange,提问作者user16642652

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:56:20