Боевой ИИ
MCE использует подключаемый паттерн стратегий для боевого ИИ. Система ИИ построена вокруг базового класса BattleAI и набора компонентов BattleAction, которые можно комбинировать для создания различных уровней сложности и стилей поведения.
Архитектура
Конвейер ИИ работает в два слоя:
- BattleAI -- Точка входа, получающая текущее состояние боя и возвращающая
BattleAction. - Компоненты BattleAction -- Отдельные блоки принятия решений, оценивающие один аспект боя (например, "стоит ли использовать суперэффективный приём?" или "стоит ли переключиться на устойчивого монстра?").
Экземпляр BattleAI содержит упорядоченный список компонентов BattleAction. Он оценивает их в порядке приоритета, и первый, выдавший допустимое действие, побеждает.
Встроенные стратегии ИИ
MCE поставляется с несколькими стратегиями ИИ, которые можно комбинировать:
RandomBattleAI
Простейший ИИ. Выбирает случайный допустимый приём каждый ход.
- Сложность: Очень лёгкая
- Применение: Дикие встречи, тренеры ранней игры
- Поведение: Случайный выбор из доступных приёмов. Без стратегического мышления.
PerformEffectiveMove
Выбирает приём, наносящий наиболее эффективный урон текущей цели.
- Сложность: Средняя
- Применение: Тренеры середины игры, лидеры залов
- Поведение: Рассчитывает эффективность типов для каждого доступного приёма и выбирает лучший. Не учитывает изменения характеристик и статусные приёмы.
PerformRandomMove
Аналогичен RandomBattleAI, но со взвешенным выбором приёмов.
- Сложность: Лёгкая
- Применение: Тренеры низкого уровня
- Поведение: Случайный выбор приёма с небольшим предпочтением атакующих приёмов перед статусными.
Встроенные компоненты действий
Эти компоненты можно компоновать в пользовательские стратегии ИИ:
| Компонент | Описание |
|---|---|
PerformEffectiveMove | Использовать приём с лучшей эффективностью типов |
PerformRandomMove | Использовать случайный приём |
MegaOrGigaIfCan | Активировать Мега-эволюцию или Gigantamax, если доступно |
SwitchToEffectiveMonster | Переключиться на члена отряда с преимуществом типа |
UseBattleItems | Использовать лечебные или статусные предметы при низком HP |
IfWildWithRunChanceRun | Дикие монстры могут попытаться сбежать |
Настройка ИИ для каждого тренера
Каждый NPC-тренер может иметь свою конфигурацию ИИ:
- В данных
Actorили встречи тренера найдите поле AI Configuration. - Назначьте ScriptableObject
BattleAI. - Настройте список компонентов действий и их порядок приоритета.
Примеры конфигураций:
Лёгкий тренер (Маршрут 1)
1. PerformRandomMove
Средний тренер (головоломка зала)
1. MegaOrGigaIfCan
2. PerformEffectiveMove
3. PerformRandomMove (запасной)
Сложный тренер (Чемпион)
1. MegaOrGigaIfCan
2. SwitchToEffectiveMonster (при невыгодном положении)
3. UseBattleItems (когда HP < 25%)
4. PerformEffectiveMove
5. PerformRandomMove (запасной)
Интерфейс IBattleAI
Для пользователей DLL-уровня система ИИ доступна через базовый класс BattleAI. Хотя вы не можете изменить внутреннюю реализацию без исходного кода, вы можете:
- Создавать новые ScriptableObject'ы
BattleAIв редакторе. - Настраивать список компонентов действий через Inspector.
- Назначать их тренерам.
Ключевой интерфейс:
public abstract class BattleAI : ScriptableObject
{
// List of BattleAction components evaluated in order
public List<BattleAction> Actions;
}
public abstract class BattleAction : ScriptableObject
{
// Evaluate whether this action should be taken
// Returns null if this action does not apply
public abstract BattleActionResult Evaluate(BattleContext context);
}
Интеграция ML-Agents
MCE включает экспериментальный ИИ на основе ML-Agents для продвинутой сложности:
MLBattleAI
Использует Unity ML-Agents для принятия решений на основе обученной нейронной сети.
- Сложность: Варьируется (зависит от обучения)
- Применение: Тренеры эндгейма, соревновательный ИИ, исследования
- Настройка: Требуется пакет ML-Agents и обученная модель
Обучение ИИ
- Установите зависимости ML-Agents:
.\MLAgentsInstall.ps1 - Настройте параметры обучения в
MLAgentsConfig/OpenMonAgent.yaml - Начните обучение:
.\RunMLTraining.ps1 - Мониторинг через TensorBoard:
.\ViewMLResults.ps1 - Экспортируйте обученную модель (файл
.onnx) - Назначьте модель компоненту
MLBattleAI
Класс MCEBattleAgent определяет пространства наблюдений и действий:
Наблюдения (что видит ИИ):
- HP% своего монстра, типы, стадии характеристик, состояния статуса.
- HP% монстра противника, типы, стадии характеристик, состояния статуса.
- Доступные приёмы и их типы.
- Состояние отряда (оставшиеся монстры, проценты HP).
Действия (что может делать ИИ):
- Использовать приём 1-4.
- Переключиться на члена отряда 1-5.
- Использовать предмет.
ML-Agents -- это отдельный пакет со своими зависимостями Python. Основная система сражений MCE работает без него. Устанавливайте ML-Agents только если планируете использовать ИИ на основе нейронных сетей.
Создание пользовательского ИИ (уровень Source)
С доступом к исходному коду вы можете создавать полностью новые стратегии ИИ:
Пользовательский BattleAction
[CreateAssetMenu(menuName = "OpenMon/AI/Actions/Use Status Move If No Status")]
public class UseStatusMoveIfNoStatus : BattleAction
{
public override BattleActionResult Evaluate(BattleContext context)
{
// Check if opponent has no status condition
if (context.OpponentBattler.StatusCondition != StatusCondition.None)
return null; // Skip this action
// Find a status-inflicting move
foreach (var moveSlot in context.OwnBattler.MoveSlots)
{
if (moveSlot.Move.Category == MoveCategory.Status
&& moveSlot.CurrentPP > 0
&& moveSlot.Move.InflictsStatus)
{
return new BattleActionResult
{
ActionType = BattleActionType.UseMove,
MoveIndex = moveSlot.Index
};
}
}
return null; // No applicable status move found
}
}
Пользовательский BattleAI
[CreateAssetMenu(menuName = "OpenMon/AI/Strategies/Expert AI")]
public class ExpertBattleAI : BattleAI
{
// Override the decision pipeline if needed
public override BattleActionResult DecideAction(BattleContext context)
{
// Custom logic that goes beyond simple action composition
// e.g., look-ahead prediction, team synergy analysis
return base.DecideAction(context);
}
}
Рекомендации по сложности ИИ
| Сложность | Компоненты ИИ | Где использовать |
|---|---|---|
| Очень лёгкая | Только случайный приём | Дикие встречи |
| Лёг кая | Случайный со взвешенными приёмами | Ранние маршруты, юные тренеры |
| Средняя | Учёт эффективности типов | Тренеры залов, соперники |
| Сложная | Эффективность + переключение + предметы | Лидеры залов, Элитная четвёрка |
| Экспертная | Полная композиция + предсказание | Чемпион, постгейм |
| Нейронная | Модель, обученная ML | Соревновательная, режимы вызова |
Лучшие практики
- Соответствуйте ИИ нарративному контексту. Случайный ловец жуков не должен играть как Чемпион.
- Тестируйте ИИ против команд игрока аналогичного уровня. Несбалансированный ИИ ощущается нечестным.
- Используйте паттерн компонентов действий. Его легче поддерживать, чем монолитные скрипты ИИ.
- Обеспечьте запасные варианты. Всегда включайте
PerformRandomMoveкак последнее действие, чтобы ИИ не застрял. - Не переоптимизируйте ИИ для ранних тренеров. Игрокам нужно изучить систему, прежде чем столкнуться с умными противниками.