Unity2D中带线条显示的枪械射线检测:无碰撞时终点计算错误求助
搞定Unity 2D射线未命中时的终点计算问题
嘿,我来帮你解决这个射线显示的问题!你的代码里其实藏着两个关键小错误,导致未命中时线条方向不对、长度异常,咱们一步步来修正:
问题出在哪?
射线检测的方向传错了
Physics2D.Raycast的第二个参数需要的是方向向量,不是鼠标的世界位置哦!你现在直接传mousePos,相当于把鼠标坐标当成了射线的方向,这肯定会让射线跑偏的。未命中时的终点逻辑搞反了
你用(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
相关产品推荐
相关产品推荐

