旋转 LineRenderer 的长度以停止在 GameObject

Rotating LineRenderer's length to Stop at GameObject

我正在尝试让 LineRender 与游戏对象一起旋转。我希望它从其父游戏对象的中心开始并延伸直到遇到另一个游戏对象。就像你站在房间里旋转时激光指示器的工作方式一样。

下面的代码是半工作的,因为它在旋转时将 LineRenderer 射到任何 GameObject 的中心。所以它跳了。就是上图中的例子C红线。

此外,我的 "walls" 在带有 "block" 标签的 Unity tilemap 中,因此唯一返回有效 RayCast2D 的对象是在 tile 之外的对象地图。墙壁确实附有 TileMap Collider 2D

A 和 B 行代表了我希望发生的事情。但是,那些没有出现,因为墙在瓦片地图中。

有什么帮助吗?

private LineRenderer lineRenderer;
private int xRot = 0;    
private void Awake() {
        lineRenderer = GetComponent<LineRenderer>();

        if (lineRenderer != null) {

            lineRenderer.transform.position = new Vector3(transform.position.x, transform.position.y, -3); // Put this higher up so the camera can see
            lineRenderer.startWidth = 0.2f;
            lineRenderer.endWidth = 0.2f;
            lineRenderer.useWorldSpace = true;
            lineRenderer.SetPosition(0, transform.position);
        }
    }


    private void void Update() {

        transform.rotation = Quaternion.Euler(0, 0, xRot);
        xRot++;
        xRot = (int)Mathf.Repeat(xRot, 360);

        Debug.DrawRay(transform.position, transform.up * 10, Color.red);

        RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.TransformPoint(Vector2.up));
        var distance = GetDistance(transform.position, hit.collider.transform.position);

        Vector3 endPos = transform.position + (hit.collider.transform.position.normalized * distance);
        lineRenderer.SetPosition(1, endPos);
    }

要修复激光四处跳跃,而不是使用碰撞器的位置,您可以使用光线投射撞击碰撞器的 point

RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.TransformPoint(Vector2.up));

if (hit.collider != null && hit.collider.tag == "block")
{
    Vector3 endPos = hit.point;
    lineRenderer.SetPosition(1, endPos);
}

我没有使用过 tilemaps,但根据 unity documentation,TileMap 碰撞器应该与普通碰撞器一样工作。