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

Unity 2D Raycast往复扫描功能异常,移动物体后角度偏移问题

问题根因
  • 可视化射线的LineRenderer组件顶点计算错误:transform.TransformDirection(Vector2.up) * 10f仅得到方向偏移量,未叠加激光发射器的世界位置,移动物体时射线起点移动但终点未同步偏移,因此出现角度偏移的视觉错误。
  • 旋转逻辑基于初始世界欧拉角计算,若后续父节点发生旋转,会出现摆动范围不符合预期的潜在问题。
修复后代码
public LineRenderer lineRenderer;
public LayerMask layerMask;
public float laserSpeed;

private float initLocalRotZ;
private Vector3 castPosition;
private RaycastHit2D rayCast;
private float time;

void Start()
{
    // 记录初始局部Z轴旋转角度,基于自身初始朝向计算摆动范围
    initLocalRotZ = transform.localEulerAngles.z;
}

void Update()
{
    time = Mathf.PingPong(Time.time * laserSpeed, 1);
    // 基于初始角度做±90度的插值旋转,使用局部欧拉角避免父节点旋转带来的影响
    float currentRotZ = Mathf.Lerp(initLocalRotZ + 90f, initLocalRotZ - 90f, time);
    transform.localEulerAngles = new Vector3(0, 0, currentRotZ);

    castPosition = transform.position;
    Vector3 laserDir = transform.up;
    rayCast = Physics2D.Raycast(castPosition, laserDir, 10f, layerMask);

    lineRenderer.SetPosition(0, castPosition);
    if (rayCast)
    {
        // 检测到碰撞时射线截断到碰撞点
        lineRenderer.SetPosition(1, rayCast.point);
    }
    else
    {
        // 无碰撞时射线延伸至最大长度,叠加起点坐标修正位置
        lineRenderer.SetPosition(1, castPosition + laserDir * 10f);
    }
}
修改说明
  1. 修正了LineRenderer终点的计算逻辑,叠加激光发射点的世界坐标,移动物体时射线会整体同步移动,不会再出现角度偏移的问题。
  2. 优化旋转计算逻辑,改用局部欧拉角记录初始角度,避免父节点旋转、场景坐标变化带来的摆动范围异常问题。
  3. 新增碰撞适配逻辑,射线检测到物体时会自动截断到碰撞点位置,更符合扫描功能的实际使用需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:05