Не могу добавить объекты проц-генерацыи к столкновению строительства по сетке
Здраствуйте. Столкнулся с такой проблемой что я не могу объекты процедурной генерации заставить сталкиватса с простыми объектами . Дело в том что я сделал свою систему строительства по сетке без коллайдеров а с двумерным массивом координат и храню в нём ссылки на объекты которые там должны хранитса. И столкнулся с проблемой , когда нарпимер выбрал дом чтоб поставить , (он находитса в воздухе и следит за мышкой) то на деревя или камни которие генерируютса рандомно он может ставитса хоть такого не должно быть . Подскажыте как исправить BuildingGrid.cs
using UnityEngine;
public class BuildingGrid : MonoBehaviour
{
[SerializeField] private Vector2Int gridSize;
private Building[,] grid;
private Building flyingBuilding;
public Building[] points;
private Camera mainCamera;
private void Awake()
{
grid = new Building[gridSize.x, gridSize.y];
mainCamera = Camera.main;
}
public void SpawnFlyingBuilding(Building buildingPrefab) // Спавним объект
{
if (flyingBuilding != null)
{
Destroy(flyingBuilding.gameObject);
}
flyingBuilding = Instantiate(buildingPrefab);
}
public void Update()
{
if ( flyingBuilding != null)
{
var groungPlane = new Plane(Vector3.forward, Vector3.zero);
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if(groungPlane.Raycast(ray,out float position))
{
Vector3 worldPosition = ray.GetPoint(position);
int x = Mathf.RoundToInt(worldPosition.x);
int y = Mathf.RoundToInt(worldPosition.y);
bool available = true;
if (x < 0 || x > gridSize.x - flyingBuilding.Size.x) available = false; // проверка , не вышли мы за границы карты
if (y < 0 || y > gridSize.y - flyingBuilding.Size.y) available = false; // проверка , не вышли мы за границы карты
if (available && IsPlaceTaken(x, y)) available = false;
flyingBuilding.transform.position = new Vector3(x, y, 0);
flyingBuilding.SetTranspatrent(available);
if (available && Input.GetMouseButtonDown(0))
{
CheckCollisionFlyingBuilding(x,y);
}
}
}
}
private bool IsPlaceTaken(int placeX,int placeY) // проверяем , можно ли поставить обэкт
{
for (int x = 0; x < flyingBuilding.Size.x; x++)
{
for (int y = 0; y < flyingBuilding.Size.y; y++)
{
if (grid[placeX + x, placeY + y] != null) return true;
}
}
return false;
}
public void CheckCollisionFlyingBuilding(int placeX,int placeY) // ставим обэкт н карту
{
for (int x = 0; x < flyingBuilding.Size.x; x++)
{
for (int y = 0; y < flyingBuilding.Size.y; y++)
{
grid[placeX + x, placeY + y] = flyingBuilding;
}
}
flyingBuilding.SetNormal();
flyingBuilding = null;
}
public void OnDrawGizmos()
{
for (int x = 0; x < gridSize.x; x++)
{
for (int y = 0; y < gridSize.y; y++)
{
//Gizmos.color = new Color(0f, 10f, 200f, 0.3f);
//Gizmos.DrawCube(transform.position + new Vector3(x, y, 0), new Vector3(1, 1, 1));
}
}
}
}
Building
using UnityEngine;
public class Building : MonoBehaviour
{
public Vector2Int Size;
[SerializeField] private SpriteRenderer sprite;
public void SetTranspatrent(bool available) // установить цвет текстуры
{
if (available)
{
sprite.color = Color.green;
}
else
{
sprite.color = Color.red;
}
}
public void SetNormal() // вернуть текстуру в нормальное положение
{
sprite.color = Color.white;
}
public void OnDrawGizmos()
{
for (int x = 0; x < Size.x; x++)
{
for (int y = 0; y < Size.y ; y++)
{
Gizmos.color = new Color(0f, 10f, 200f, 0.3f);
Gizmos.DrawCube(transform.position + new Vector3(x, y, 0), new Vector3(1, 1, 1));
}
}
}
}
Procedure Generation
using UnityEngine;
public class ProcedurGeneration : MonoBehaviour
{
public GameObject[] objects;
private void RandomGeneratoin()
{
int randomPoint = Random.Range(0, objects.Length);
Instantiate(objects[randomPoint], transform.position, Quaternion.identity);
}
public void Start()
{
RandomGeneratoin();
}
}
Если что на точках где должны спавнитса древья, камни , трава есть скрипт Building с указаным размером