RayCastHit2D 导致不一致的碰撞

RayCastHit2D causing inconsistent collissions

我正在制作一款 2.5D 俯视游戏。我创建了一个用于将对象放置在我的网格上的脚本。但它的行为真的很奇怪。它应该捕捉到网格,但如果我尝试放置对象的网格位于游戏中对象的顶部或左侧,它会触发碰撞(参见 GIF):

我正在使用 RayCastHit2D 来检测碰撞,这是我的脚本:

    public GameObject finalObject;

private Vector2 mousePos;
private RaycastHit2D rayHitCollision;
private RaycastHit2D rayHitInteractive;
private Renderer rend;
private Color green;
private Color red;

public LayerMask collisionLayer;
public LayerMask interactiveLayer;

void Start()
{
    rend = GetComponent<Renderer>();
    red = Color.red;
    red.a = .5f;

    green = Color.green;
    green.a = .5f;

    rend.material.SetColor("_Color", green);
}

void Update()
{
    //get pos of mouse
    mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    //place object at rounded mouse pos (snapping)
    transform.position = new Vector2(Mathf.Round(mousePos.x), Mathf.Round(mousePos.y));

    if (GameManager.manager.mainState == GameManager.MainState.PLACEMENT)
    {
        //In order to collide with object, they must be on same layer, this includes tilemap stuff

        rayHitCollision = Physics2D.Raycast(transform.position, Vector2.zero, Mathf.Infinity, collisionLayer);

        //if tile is colliding with other tile show red, REMEMBER THIS IS EFFECTED BY LAYERS
        if (rayHitCollision.collider != null)
        {
            rend.material.SetColor("_Color", red);
        }
        //if not colliding, check for mouse press and place
        else
        {
            rend.material.SetColor("_Color", green);
            if (Input.GetMouseButtonDown(0))
            {
                if (rayHitCollision.collider == null)
                {
                    //place object
                }
            }
        }
    }
}

为了让我的游戏对象捕捉到网格,我必须将枢轴设置为右下角(如果它们位于中心,它们将被放置在网格交叉点)。 这意味着我必须像这样自定义他们的对撞机:

如你所见,我的Collider正好是一格(我用的是16ppu):

我在这里被难住了,有人知道这里出了什么问题吗?可能值得添加,我尝试将它们的碰撞器大小更改为 0.9 而不是 1,但这只是完全禁用 RaycastHit2D,我可以将对象放在彼此之上等

可能是由于您的对齐修复,您的光线投射是从图块的角而不是中心发射的,这会产生不明确的结果。您可以通过查看是否向光线投射起始位置添加半个图块的偏移量来解决这个问题(不确定是 + 还是 -):

rayHitCollision = Physics2D.Raycast(transform.position + new Vector2(0.5f, 0.5f), Vector2.zero, Mathf.Infinity, collisionLayer);

如果此答案不正确,请随意投反对票。它是基于直觉,我没有统一在这台机器上试一试。