Продолжается разработка генератора ландшафта для 2D игры в Unity, выполненной в стиле Pixel Art. В предыдущем видео был создан базовый генератор плоского ландшафта из белых блоков. Теперь добавим цвет и разнообразие, используя различные текстуры блоков.
Рефакторинг кода и абстракции
Текущая реализация генератора, основанная на компоненте TileGenerator, неудобна для дальнейшего развития. Используем абстракции для улучшения структуры кода. Ландшафт представим как совокупность ячеек (Cell), каждая из которых визуализируется в зависимости от окружающих ячеек. Это позволит создавать более сложные и реалистичные ландшафты, где внешний вид блока земли будет зависеть от расположения соседних блоков.
Интерфейс ICell
Создадим интерфейс ICell для описания логики ячейки. Он содержит метод Refresh, принимающий абстракцию ITileMap (карта высот). ITileMap — двумерный массив высот, который в дальнейшем будет расширен для поддержки пещер и других элементов ландшафта. ICell также содержит свойство Count (количество ячеек) и метод GetCell для получения ячейки по координатам. Всё это размещается в пространстве имён Constants.
namespace Constants
{
public interface ICell
{
int Count { get; }
ICell GetCell(Vector2Int position);
void Refresh(ITileMap tileMap, Vector2Int position);
}
public interface ITileMap
{
// ... (методы и свойства для работы с картой высот)
}
}
Реализация HeatMap
Класс HeatMap реализует интерфейс ITileMap. Он хранит карту высот в виде одномерного массива heights. Конструктор принимает ширину и высоту карты. Метод GetCount возвращает общее количество ячеек, а метод SetHeight устанавливает высоту в определённой точке, проверяя корректность входных данных и выбрасывая исключение ArgumentException при ошибке.
public class HeatMap : ITileMap
{
private int[] heights;
public HeatMap(int width, int height)
{
heights = new int[width * height];
}
public int GetCount()
{
return heights.Sum();
}
public void SetHeight(int x, int y, int height)
{
if (height < 0 || x < 0 || x >= heights.Length || y < 0 || y >= heights.Length)
{
throw new ArgumentException("Invalid arguments");
}
heights[x + y * heights.Length] = height;
}
// ... (другие методы для работы с картой высот)
}
Генерация и визуализация ландшафта
Генерация ландшафта осуществляется путём заполнения HeatMap случайными высотами. Визуализация выполняется отдельным компонентом TileMapRenderer, который принимает HeatMap и отображает его на сцене, создавая и размещая игровые объекты, представляющие ячейки ландшафта. TileMapRenderer содержит методы для управления размерами карты и использует пул объектов для оптимизации производительности. В процессе визуализации используется паттерн «Приспособленец» (Visitor Pattern).
Настройка отображения тайлов
Внешний вид тайлов настраивается классом GroundTile, который наследуется от MonoBehaviour и реализует интерфейс ICell. Он позволяет задавать различные спрайты для тайла в зависимости от его окружения. Настройка спрайтов производится через инспектор Unity.
Проблемы и дальнейшие планы
В процессе разработки возникли проблемы с некорректным отображением высот в некоторых областях карты. В планах — улучшение системы настройки тайлов и добавление редактора для визуализации генератора в Unity без запуска игры.