Спавн объектов так, чтобы они не пересекались

У меня есть набор префабов, которые я хочу спавнить в комнате так, чтобы они не пересекались. Написал следующий код:

void SpawnObstacle() {
        var index = Random.Range(0, _obstacles.Length);

        for (int i = 0; i < 10; i++) {
            var newPos = new Vector2(Random.Range(minX, maxX), Random.Range(minY, maxY));

            if (CheckPos(_obstacles[index].GetComponent<Wall>(), newPos)) {
                var obj = Instantiate(_obstacles[index]);
                obj.transform.position = newPos;
                Debug.Log("Object " + _obstacles[index] + " on " + newPos);
                break;
            }
        }
    }


    bool CheckPos(Wall wall, Vector2 pos) {
        wall.CalculateSize();

        Vector2 topRight = new Vector2(pos.x + wall.xSize / 2, pos.y + wall.ySize / 2);
        Vector2 bottomLeft = new Vector2(pos.x - wall.xSize / 2, pos.y - wall.ySize / 2);
        var collider = Physics2D.OverlapArea(topRight, bottomLeft);

        Debug.Log(collider);

        if (collider != null) {
            return false;
        }

        return true;
    }

Класс Wall:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Wall : MonoBehaviour
{
    public float xSize = 0.0f;
    public float ySize = 0.0f;
    

    public void CalculateSize() {

        xSize = GetComponent<BoxCollider2D>().size.x;
        ySize = GetComponent<BoxCollider2D>().size.y;
    }
}

Однако всё равно объекты пересекаются. Потыкался и заметил, что Physics2D.OverlapArea не всегда будто бы выдаёт нужный результат. Что делать? Где ошибка?


Ответы (0 шт):