Задать вопрос
Amagitsune
@Amagitsune
3D modeller, начинающий игродел

Как записать вручную расставленные объекты в двумерный массив?

Имеется игровое поле с двумерным массивом сеткой 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;
    }



}
  • Вопрос задан
  • 199 просмотров
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы