Unity3D on Click 忽略所有对撞机接受特定层上的对撞机

Unity3D on Click ignore all colliders accept the one on specific layer

我正在尝试制作一个简单的拖放游戏,其中有可以拾取的对象,如果留在屏幕高度的 1/2 以上,那么它会掉落到高处,如果你放手,它们就会掉落他们走到屏幕的一半以下,他们将留在那里。这是一款 2D 游戏,给人一种深度的错觉。

这是我想做的东西的图片

目前我可以从底部移动蓝色桶。如果我将桶举到 PolygonCollider 上方,它会掉落到 Edge Collider 4。当我把它放在 Polygone Collider 的某个地方时,我将物体设置为动能,这样它就不会掉落,它会给人一种你把它放在地上的错觉。

我的问题是我用来检测点击的桶的碰撞器将与多边形碰撞器重叠。有时物体在顶部,有时是多边形碰撞器,如果多边形碰撞器在顶部,我无法抬起物体。 有没有一种方法可以在单击时忽略除我用来识别可以拾取的对象的 PickebleObject 层之外的所有层?

编辑:这是我的 ObjectController 脚本

public LayerMask interactLayers;
public LayerMask ignoredColliders;
public Action<GameObject> OnDrag;
public Action<GameObject> OnLand;
private Rigidbody2D objRB2D;
private Vector2 MousePos;
private bool IsOnFloor = false;


private void Start()
{
    transform.position = new Vector3 (transform.position.x, transform.position.y, transform.position.z - 0.1f);
    ignoredColliders = ~ignoredColliders;
    objRB2D = transform.GetComponent<Rigidbody2D>();
    objRB2D.gravityScale = GameManager.Instance.GlobalFallingSpeed;
}


private void OnMouseDown()
{
    objRB2D.isKinematic = true;
}

private void OnMouseDrag()
{
    MousePos = Camera.main.ScreenToWorldPoint (new Vector2 (Input.mousePosition.x, Input.mousePosition.y ));
    //Limit So elements cant be moved out of the scene.
    float HorizontalClamp = Mathf.Clamp (MousePos.x, CameraControll.Instance.CamTopLeft.x, CameraControll.Instance.CamBottomRight.x);
    transform.position = new Vector3 (HorizontalClamp, MousePos.y, transform.position.z);

    //Check what is under the mouse.
    RaycastHit2D IsHoveringOver = Physics2D.Raycast(transform.position,  transform.TransformDirection (Vector3.down), 0 , ignoredColliders);
    if (IsHoveringOver.transform != null) {
        if (GameManager.Instance.GroundColliders.value == LayerMask.GetMask (LayerMask.LayerToName (IsHoveringOver.transform.gameObject.layer)))
            IsOnFloor = true;
    }else IsOnFloor = false;


    RaycastHit2D HitColider = Physics2D.Raycast(transform.position,  transform.TransformDirection (Vector3.down), Mathf.Infinity , ~ignoredColliders);

    #if UNITY_EDITOR
    if (HitColider.collider != null) {
        Debug.DrawLine( HitColider.point, transform.position, Color.magenta);
    }
    #endif
}

void OnMouseUp()
{
    if (!IsOnFloor) objRB2D.isKinematic = false;
}

void OnCollisionEnter2D(Collision2D coll) {
    //Debug.Log(coll.gameObject.transform.name);
}

如果您在拖放逻辑中使用物理光线投射,请查看此 documentation,您会在其中找到有关 LayerMask 和光线投射的主题。

我通过使用 Z 轴定义哪个碰撞器位于顶部来解决问题。