Система движения по сетке
MCE использует систему движения по тайловой сетке, построенную на Tilemap Unity. Игрок и NPC перемещаются по одному тайлу за раз по дискретной сетке, а обнаружение столкновений, эффекты местности и переходы между картами обрабатывает система сетки.

Игрок всегда находится ровно на одном тайле. Нет ни полушага, ни позиции внутри тайла, и именно это делает встречи, столкновения и переходы между картами определяемыми, а не приблизительными.
Основные компоненты
GridController
GridController — менеджер тайловой сетки для каждой сцены. Он находится на том же GameObject, что и Grid Unity (требует его), и:
- Находит Tilemap сцены и отвечает на запросы о тайлах по всем ним — от наивысшего порядка сортировки к низшему.
- Читает тип движения каждого тайла из ассета
TileDataпроекта (см. Пользовательские типы тайлов). - Отслеживает персонажей и акторов, зарегис трированных в сетке.
- Хранит
SceneInfoсцены (см. ниже). - Отвечает на запросы о столкновениях: может ли персонаж переместиться на этот тайл, с этого тайла?
В каждой сцене карты один GridController в корне её сетки.
MCECharacterController
MCECharacterController управляет движением любого персонажа (игрока, NPC или монстра) по сетке:
- Движение с привязкой к сетке: персонажи перемещаются ровно на один тайл за шаг.
- Движение в 4 направлениях: вверх, вниз, влево, вправо. Без диагонального движения.
- Отрисовка спрайта: обновляет направление спрайта и анимацию ходьбы.
- Проверка столкновений: перед каждым перемещением запрашивает
GridController. - Скорость движения:
Speed, в секундах на тайл (по умолчанию 0,25).
PlayerCharacter
PlayerCharacter добавляет поверх контроллера возможности, специфичные для игрока:
- Обработка ввода (клавиатура и геймпад).
- Триггеры взаимодействия (нажатие кнопки действия лицом к NPC/объекту).
- Обработка диких встреч, шаги репеллента и счётчик шагов (
GlobalGameData.StepsTaken, который также управляет циклами яиц и дружбой). - Бег, езда на велосипеде и плавание.
- Координация монстра-последователя и горячие клавиши эмоций.
GlobalGridManager
GlobalGridManager отвечает за навигацию между картами:
- Ведёт список загруженных сеток и находит сетку, у которой есть тайл в мировой позиции, чтобы персонаж мог перейти с одной карты на соседнюю.
- Аддитивно загружает соседей текущей карты и соседей этих соседей (на два шага вглубь), поэтому пересечение промежуточной карты не выгружает ту, откуда вы пришли.
- Передаёт игрока, когда персонаж переходит из одной сетки в другую.
Типы тайлов
У каждого ассета тайла есть тип движения (TileType), назначаемый в ассете TileData:
| TileType | Описание |
|---|---|
NonExistent | У тайла нет данных; считается пустотой |
Walkable | Обычная земля |
NonWalkable | Твёрдое препятствие (стены, деревья, камни) |
Jumpable | Уступ: преодолевается прыжком в одном направлении |
Bridge | Поверхность моста, расположенная выше того, что под ней |
BridgeEntrance | Переходный тайл между землёй и мостом |
Water | Вода, которую нужно пересекать вплавь |
Waterfall | Вертикальная вода, по которой можно подняться |
Slippery | Лёд: персонаж скользит, пока не упрётся в препятствие |
WalkableNotBikable | Проходим пешком, но не на велосипеде |
Поверх типа поведения тайлов (компоненты на префабе тайла) добавляют логику: EncounterTile отмечает зону диких встреч, OneWayJumpableTile задаёт направление уступа, ForceCharacterToKeepMoving создаёт конвейеры и течения, а также TallGrass, LadderUp, WaterfallEdge, WhirlwindInDirection и другие. Все они описаны в разделе Пользовательские типы тайлов.
Настройка карты
Шаг 1: Создайте структуру Tilemap
Карты MCE используют стандартную иерархию Tilemap Unity:
Grid (Grid + GridController)
└── Ground (Tilemap, TilemapRenderer, sorting order 0)
└── GroundOverlay (Tilemap, TilemapRenderer, sorting order 1)
└── Above ... (more Tilemaps as needed)
└── Actors (NPC GameObjects)
Отдельного тайлмапа столкновений рисовать не нужно: движение блокирует TileType тайлов, которые вы нарисовали.
Шаг 2: Нарисуйте карту
Используйте оверлей Редактора карт или Tile Palette Unity (Window > 2D > Tile Palette), чтобы нарисовать карту:
- Слой Ground: базовая местность (тропы, трава, земля, берега воды).
- Слои оверлея: украшения поверх земли (цветы, камни, тени) и то, что рисуется поверх игрока (кроны деревьев).
- Тайлы встреч: тайлы, префаб которых несёт
EncounterTile, где появляются дикие монстры.
Шаг 3: Добавьте GridController
- Выберите корневой GameObject Grid.
- Добавьте компонент
GridController. - Контроллер получает ассет
TileDataпроекта через внедрение зависимостей; убедитесь, что каждый нарисованный вами тайл зарегистрирован там с правильнымTileType(помогают кнопки Populate и CheckInvalid ассета). Незарегистрированный тайл считается проходимым и пишет предупреждение.
Шаг 4: Настройте SceneInfo
Каждой сцене карты нужен компонент SceneInfo, указывающий на SceneInfoAsset (создаётся кнопкой New Scene Info на вкладке Database в Hub). Назначьте компонент в поле Scene Info у GridController. Ассет содержит:
| Поле | Описание |
|---|---|
| Scene | Сцена, которую описывает эта информация |
| Localizable Name Key | Отображаемое наз вание места (показывается в заголовке) |
| Neighbours / Neighbour Offsets | Карты, соединяющиеся с этой, и их положение в тайлах (бесшовные переходы) |
| Background Music | Музыка этой карты |
| Is Affected By Sky, Default Weather, Allowed Weathers | Дневной/ночной свет и погода |
| Can Open Storage Here, Can Fly From Here, Can Teleport From Here, Can Escape Rope From Here, Can Fish Here | Что игрок может делать здесь |
| Is Dungeon, Is Dark | Карта-подземелье использует встречи Cave на каждом тайле |
| Region, Tags | Регион и теги сцены, используемые игровой логикой (например, «Cave», «Town», «Route») |
| Encounters, Battle Scenarios Per Encounter, Own Encounter Chances | Дикие встречи карты: см. Дикие встречи |