Доступ к участкам: маски и закрытие прохода
Разделить доступ по возможностям без неверных битовых условий.
Для разных прав доступа к одной геометрии используйте маску запроса, а не новое запекание для каждого ключа. Размер персонажа проверяется другим механизмом: варианты зазора.
Разметить проход
В выполненном примере комнаты занимают x=0–10 и x=20–30, а промежуточный регион-проход — x=10–20; у всех диапазон y=0–10. Комнаты принадлежат публичному слою 1, проход — служебному слою 2. Геометрия соединена на одной карте.
Сохраните DoorAccess.cs:
public static class DoorAccess
{
public const uint Public = 1u;
public const uint StaffDoor = 2u;
public static uint QueryMask(bool hasDoorAccess) =>
Public | (hasDoorAccess ? StaffDoor : 0u);
}Назначьте проходу NavigationLayers = DoorAccess.StaffDoor, комнатам — DoorAccess.Public. Передавайте DoorAccess.QueryMask(hasDoorAccess) в параметр navigationLayers нового MapGetPath либо в NavigationAgent2D.NavigationLayers.
Проверено: маска 1 не даёт полный путь из (5, 5) в (25, 5); маска 3 допускает и комнаты, и проход. Маска 2 сама по себе недостаточна: она допускает проход, но не публичные комнаты.
Это пересечение битов, а не система условий
Регион допускается, если у него и запроса есть хотя бы один общий бит. Несколько битов региона не означают «нужны все ключи». Если дверь требует ключ и выполненное задание одновременно, сначала вычислите hasDoorAccess по правилам игры, затем выберите маску.
Не ставьте служебной двери одновременно публичный слой, если доступ должен быть закрыт обычному персонажу: любой общий публичный бит разрешит регион. Номера слоёв и маски различаются — правила битов.
Закрытие и отзыв доступа
Изменение маски запроса влияет на новый поиск. Для уже полученного массива запросите новый маршрут и обработайте недостижимость. Включение/отключение региона применяется после публикации изменения карты.
Если дверь закрыта для всех, отключите её регион. В проверке после RegionSetEnabled(doorway, false) полный путь исчезает и для служебной маски. Ранее сохранённый массив при этом не меняется. Само отключение навигации также не создаёт физический коллайдер двери.
Разрешение поиска — не окончательное разрешение игрового действия. Проверяйте доступ при фактическом открытии двери или переходе: персонаж может получить старый маршрут, быть перенесён или управляться сетевым клиентом.
Диагностика
- Служебный проход доступен всем: проверьте лишний публичный бит или обходной регион.
- Ключ есть, пути нет: включите в маску и обычные комнаты, и проход; проверьте карту и соединения.
- После отзыва права персонаж продолжает идти: пересчитайте сохранённый маршрут и отдельно остановите недопустимое действие.
- Меняется весь уровень для каждого персонажа: попробуйте маски новых запросов вместо постоянного переключения общего региона.
Проверены точный помощник, три маски, закрытие общего прохода и сохранение старого массива в 2D. Проверка игровых ключей/заданий, физическая дверь, сетевые разрешения и 3D-проходы этим набором не покрыты.