Имеется игровое поле с двумерным массивом сеткой 10х10, на которой можно расставлять домики 1х1, 2х2, 3х3, нужно создать на поле препятствия 1х1 и записать их в массив, чтобы при установке домиков учитывать препятствия(которые можно разрушить и освободить место).
Домики ставить научился, пересечения все учитываются, но вручную расставленные препятствия не имею понятия как в массив внести, пробовал сделать это через FindObjectWithTag, т.к. массив вроде хранит в себе префабы.
Прошу помочь советом или ссылями на полезные ресурсы для решения этой задачки.
Код ниже:
using UnityEngine;
public class BuildingGrid : MonoBehaviour
{
public Vector2Int GridSize = new Vector2Int(10, 10);
private Building[,] grid;
private Building flyingBuilding;
private Camera mainCamera;
private Building ruins;
private void Awake()
{ //задаем двумерный массив
grid = new Building[GridSize.x, GridSize.y];
mainCamera = Camera.main;
}
//метод создания строения на карте, уничтожает объект, которым мы водим по сцене мышкой и ставит префаб на место клика
public void StartPlacingBuilding(Building buildingPrefab)
{
if (flyingBuilding != null)
{
Destroy(flyingBuilding.gameObject);
}
flyingBuilding = Instantiate(buildingPrefab);
}
private void Update()
{
if (flyingBuilding != null)
{
var groundPlane = new Plane(Vector3.up, Vector3.zero);
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (groundPlane.Raycast(ray, out float position))
{
Vector3 worldPosition = ray.GetPoint(position);
//эта часть для того, чтобы объект двигался строго по целочисленным координатам
int x = Mathf.RoundToInt(worldPosition.x);
int y = Mathf.RoundToInt(worldPosition.z);
//тут задаем available чтобы отображать где можно ставить и где нет, ниже проверки
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, 0, y);
flyingBuilding.SetTransparent(available);
//по нажатию мыши после проверок ставим здание
if (available && Input.GetMouseButtonDown(0))
{
PlaceFlyingBuilding(x, y);
}
}
}
}
//этот кусок для того, чтобы проверить занята клетка или нет, циклом проверяет по массиву занята ли хоть одна нужная клетка и если да возвращает false
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;
}
//этот метод для установки здания и записи его в массив
private void PlaceFlyingBuilding(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;
}
}
//красим здание в нормальный цвет после установки из скрипта на здании Building
flyingBuilding.SetNormal();
flyingBuilding = null;
}
}