Unity 2D:销毁所有重叠的对象

时间:2018-07-06 08:47:25

标签: unity3d collision overlapping

我正在制作2D等距城市建筑游戏。世界分为瓷砖,您可以单击一个按钮以开始放置建筑物。该建筑物将跟随您的鼠标在地图上,并在您单击另一个按钮时将其放置(工作正常)。但是,如果要将(新)建筑物放置在另一(旧)建筑物上,则该(旧)建筑物需要被销毁。

所有建筑物都具有Ridgidbody2D(运动学)和Boxcollider2D。

Picture: The setup for the Building

Ps:这是我在这个论坛上的第一个问题,如果我可以改善我的问题,请告诉我。

private bool Place;
public bool Destr;
Vector2 pz;
private SpriteRenderer spriteRenderer;

public void Awake()
{
    Place = true;
}

public void Update()
{
    if (Place)
    {
        pz = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        if (Mathf.RoundToInt(pz.x) % 2 != 0)
            pz.x = Mathf.RoundToInt(pz.x) + 1;

        if (Mathf.RoundToInt(pz.x) % 4 == 0)
        {
            pz.x = Mathf.RoundToInt(pz.x);
            if (Mathf.RoundToInt(pz.y) % 2 == 0)
            {
                pz.y = Mathf.RoundToInt(pz.y) + 1;
            }
            else
                pz.y = Mathf.RoundToInt(pz.y);
        }
        else
        {
            pz.x = Mathf.RoundToInt(pz.x);
            if (Mathf.RoundToInt(pz.y) % 2 == 0)
            {
                pz.y = Mathf.RoundToInt(pz.y);
            }
            else
                pz.y = Mathf.RoundToInt(pz.y) + 1;
        }

        transform.position = pz;
    }

    if (Input.GetButtonDown("Place2") && Place)
    {
        Place = false;
        float IsoX = Mathf.Abs(pz.x) / 2;
        float IsoY = (pz.y - 1 - IsoX) / 2;
        spriteRenderer = GetComponent<SpriteRenderer>();
        spriteRenderer.sortingOrder = -(20 * Mathf.RoundToInt(IsoY) + Mathf.RoundToInt(IsoX)) + 1;

        // New code

        for (var i = 0; i < Obj.Count; i++)
        {
            Destroy(Obj[i]);
        }
    }
}

void OnCollisionEnter2D(Collision2D other)
{
    if(Place)
    {
        Obj.Add(other.gameObject);
    }
}

private void OnCollisionExit2D(Collision2D other)
{
    if (Place)
    {
        Obj.Remove(other.gameObject);
    }
}

0 个答案:

没有答案