Unity 2D: уничтожить все перекрывающиеся объекты - PullRequest
0 голосов
/ 06 июля 2018

Я делаю 2D изометрическую городскую игру. Мир разделен на плитки, и вы можете нажать кнопку, чтобы начать размещение здания. Здание будет следовать за вашей мышью по карте, и когда вы нажмете другую кнопку, оно будет размещено (это работает нормально). Но если вы хотите разместить (новое) здание поверх другого (старого) здания, это (старое) здание необходимо уничтожить.

Все здания имеют Ridgidbody2D (кинединамику) и Boxcollider2D.

Изображение: установка для здания

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);
    }
}
...