Скриптинг И.И.: Сигналы
Материал из CryWiki Russia
|
Содержание |
Сигналы
Краткий обзор
CryAISystem (система искусственного интеллекта CryEngine) предлагает мощный, полностью настраиваемый инструмент для коммуникации ИИ сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:
- как посылать сигналы от поведения агента к другим агентам
- как определять подмножество агентов, которые получат посылаемый сигнал
- как агент получатель может реагировать на посланный сигнал
Посылание сигналов
Метод посылания сигналов следующий:
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id); -- смысл этой записи: -- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)
Где:
Signal_filter: определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс SIGNALFILTER_. Полный список доступных сигнальных фильтров представлен ниже.
signal_type
| описание
|
1 |
сущность, получающая сигнал, будет обрабатывать его только если она активна и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно) |
0 |
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование |
-1 |
сущность, получающая сигнал, будет обрабатывать его безоговорочно |
MySignalName: фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в DEFAULT.lua скриптовом файле для того чтобы реагировать на полученный сигнал.
entity_id: это id сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из entity а не из её behavior), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.
Определение, кто будет получать сигнал
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. Параметр фильтра сигнала в вызове функции AI:Signal (...) может быть один из следующих:
Signal filter
| Сигнал посылается к:
|
0 |
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) |
SIGNALFILTER_LASTOP |
Цель последней операции сущности (если таковая имеется) |
SIGNALFILTER_TARGET |
Текущая цель внимания сущности |
SIGNALFILTER_GROUPONLY | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с
отправителем |
SIGNALFILTER_SUPERGROUP |
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне |
SIGNALFILTER_SPECIESONLY | Все сущности с таким же параметром species как и у отправителя, на расстоянии коммуникации с
отправителем |
SIGNALFILTER_SUPERSPECIES |
Все сущности с таким же параметром species как и у отправителя,на всём уровне |
SIGNALFILTER_HALFOFGROUP |
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) |
SIGNALFILTER_NEARESTGROUP |
Ближайшая сущность к отправителю в его группе |
SIGNALFILTER_NEARESTINCOMM |
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации |
SIGNALFILTER_ANYONEINCOMM |
Все сущности в радиусе коммуникации отправителя |
SIGNALID_READIBILITY |
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие readability (звук/анимация). |
Прием сигнала
Действие, которое должно быть показано, когда получен сигнал, определяется в функции как следующая:
MySignalName = function(self, entity, sender) ... end где self: это behavior сущности entity: сама сущность sender: отправитель сигнала
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в default idle behavior - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа character изменить своё поведение behavior; если мы добавим строчку как нижеследующая в файле персонажа character:
Behaviour1 = { OnEnemySeen = *Behaviour1*, OnEnemyMemory = *Behaviour2*, … MySignalName = *MyNewBehaviour*, }
Это означает, что если character на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на «MyNewBehaviour».