Система диких встреч
Система встреч определяет, когда и какие дикие монстры появляются при исследовании мира игроком. MCE поддерживает несколько методов встреч, настраиваемые таблицы вероятностей, диапазоны уровней и встречи по времени суток.
Как работают встречи
- Игрок ходит по тайлу с данными встреч.
- На каждом шаге система бросает против частоты встреч.
- Если бросок успешен, монстр выбирается из таблицы встреч тайла на основе взвешенной вероятности.
- Создаётся объект
BattleParametersс данными о виде, уровне и форме выбранного монстра. BattleLauncherпереходит к сцене сражения.
WildEncountersSet
ScriptableObject WildEncountersSet определяет таблицу встреч для данной области:
Создайте через: Assets > Create > OpenMon > Wild Encounters Set
Каждая запись в наборе содержит:
| Поле | Описание |
|---|---|
| Monster | Ссылка на ScriptableObject MonsterEntry |
| Min Level | Минимальный уровень дикого монстра |
| Max Level | Максимальный уровень дикого монстра |
| Probability | Относительный вес для данной записи (чем выше, тем чаще) |
Фактический уровень случайно выбирается между Min и Max при каждом срабатывании встречи.
Расчёт вероятности
Вероя тности -- это относительные веса, а не проценты. Система суммирует все веса и рассчитывает шанс каждой записи:
Chance = Entry Weight / Sum of All Weights
Пример таблицы:
| Монстр | Вес | Фактический шанс |
|---|---|---|
| Leafpup | 40 | 40/100 = 40% |
| Windling | 30 | 30/100 = 30% |
| Silkworm | 20 | 20/100 = 20% |
| Sparkbit | 10 | 10/100 = 10% |
Типы встреч
MCE поддерживает различные методы встреч через перечисление EncounterType:
| Тип | Триггер | Описание |
|---|---|---|
| Walking | Ходьба через высокую траву или пещеры | Стандартные встречи в открытом мире |
| Surfing | Сёрфинг по водным тайлам | Встречи на водной поверхности |
| Fishing | Использование удочки на воде | Встречи на основе удочки (Old Rod, Good Rod, Super Rod) |
| RockSmash | Использование Rock Smash на разрушаемом камне | Встречи на основе камней |
| Headbutt | Использование Headbutt на дереве | Встречи на основе деревьев |
Каждый WildEncountersSet может иметь встречи, разделённые по типу. Учитываются только встречи, соответствующие текущему действию (ходьба, сёрфинг, рыбалка).
Настройка зон встреч
Метод 1: Компонент EncounterTile
- В вашей сцене создайте пустой GameObject в иерархии карты.
- Добавьте компонент
EncounterTile. - Назначьте
WildEncountersSetв поле Encounters. - Расположите и масштабируйте зону встреч для покрытия н ужных тайлов.
Метод 2: Встречи по умолчанию в SceneInfo
SceneInfo каждой сцены может иметь WildEncountersSet по умолчанию. Любой проходимый тайл травы в сцене будет использовать эту таблицу встреч, если она не переопределена конкретным EncounterTile.
Метод 3: Встречи по тайлам
Для точного контроля вы можете назначить разные наборы встреч различным областям одной карты. Разместите несколько компонентов EncounterTile, покрывающих разные регионы.
Частота встреч
Частота встреч контролирует, как часто встречи срабатывают за шаг:
- Базовая частота: Настраивается для каждой зоны встреч (типичный диапазон: 5-25%).
- Модификаторы: Предметы (например, Repel снижает до 0%), способности (например, Stench снижает частоту) и предметы (например, Cleanse Tag).
- Счётчик шагов: Система отслеживает шаги с последней встречи. После многих шагов без встречи частота немного увеличивается, чтобы предотвратить длительные серии без встреч.
Встречи по времени суток
Разные монстры могут появляться в разное время суток:
| Период | Часы |
|---|---|
| Утро | 06:00 - 11:59 |
| День | 12:00 - 17:59 |
| Вечер | 18:00 - 20:59 |
| Ночь | 21:00 - 05:59 |
Настройте временные встречи, создав отдельные ассеты WildEncountersSet для каждого периода и назначив их через конфигурацию времени суток зоны встреч.
Встречи с формами
Некоторые виды имеют формы, которые появляются по-разному в зависимости от условий. EncounterFormCalculator определяет, в какой форме появляется дикий монстр:
- Региональные формы: На основе тега региона карты.
- Сезонные формы: На основе внутриигрового календаря.
- Случайные формы: Случайный выбор из доступных форм.
Используйте компонент SingleFormEncounter для принудительного появления определённой формы в записи встречи.
Специальные паттерны встреч
Рыбалка
Встречи при рыбалке требуют от игрока использования удочки, сто я перед водным тайлом:
- Создайте
WildEncountersSetс записямиEncounterType.Fishing. - Назначьте его конфигурации встреч водной области.
- Разные уровни удочек (Old Rod, Good Rod, Super Rod) фильтруют доступные записи.
Легендарные / одноразовые встречи
Для особых встреч, которые должны произойти только один раз:
- Используйте событие CommandGraph вместо случайных встреч.
- Событие проверяет игровую переменную (например,
LegendaryDefeated) перед срабатыванием. - После боя устанавливается переменная для предотвращения повторных встреч.
- Этот подход даёт полный контроль над контекстом встречи (катсцены, диалоги, местность).
Групповые встречи
Несколько диких монстров одновременно:
- Настройте запись встречи с флагом группы.
- В бою появляются 3-5 монстров указанного вида.
- Игрок сражается с ними по одному или может целиться в группу (приёмами области, если поддерживается).
Репеллы и предотвращение встреч
Игроки могут использовать предметы для предотвращения встреч:
| Предмет | Эффект | Длительность |
|---|---|---|
| Repel | Предотвращает встречи с монстрами ниже уровня лидера игрока | 100 шагов |
| Super Repel | Тот же эффект, большая длительность | 200 шагов |
| Max Repel | Тот же эффект, наибольшая длительность | 250 шагов |
Репеллы реализованы как счётчик шагов. Система встреч проверяет счётчик репелла перед броском на встречу.
Утилиты встреч
Класс EncounterUtils предоставляет вспомогательные методы:
// Check if encounters are possible at the current tile
bool canEncounter = EncounterUtils.CanEncounterAt(position, encounterType);
// Get the encounter set for a position
WildEncountersSet set = EncounterUtils.GetEncounterSet(position, encounterType);
// Roll for an encounter (returns null if no encounter triggers)
WildEncounter encounter = EncounterUtils.RollEncounter(set);
Лучшие практики
- Балансируйте частоту встреч. Слишком высокая (>25%) раздражает. Слишком низкая (<5%) делает мир пустым. 8-15% -- типичное значение.
- Масштабируйте уровни с прогрессией. На Маршруте 1 должны быть монстры уровней 2-5, а не 50.
- Варьируйте таблицы встреч между картами. Каждый маршрут должен ощущаться уникальным.
- Включайте редкие встречи. Одна запись с 5% в таблице даёт игрокам цель для поиска.
- Тестируйте встречи по времени суток. Игроки не должны чувствовать себя наказанными за игру в определённое время.
- Размещайте репеллы рано. Игроки ценят контроль над встречами до середины игры.