Скриптинг И.И.: Сигналы

Материал из CryWiki Russia

(Различия между версиями)
Перейти к: навигация, поиск
(Посылание сигналов)
(Определение, кто будет получать сигнал)
Строка 87: Строка 87:
|-
|-
| width="30%" | SIGNALFILTER_GROUPONLY  
| width="30%" | SIGNALFILTER_GROUPONLY  
-
| width="70%" | Все сущности в группе посылателя, например враги с такой же группой id, на расстоянии коммуникации с  
+
| width="70%" | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с  
отправителем
отправителем
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_SUPERGROUP
-
| width="70%" | ----
+
| width="70%" |  
 +
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_SPECIESONLY
-
| width="70%" | ----
+
| width="70%" | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с
 +
 
 +
отправителем
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_SUPERSPECIES
-
| width="70%" | ----
+
| width="70%" |  
 +
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_HALFOFGROUP
-
| width="70%" | ----
+
| width="70%" |  
 +
Половина сущностей в группе отправителя (нет способа определить какие именно сущности)
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_NEARESTGROUP
-
| width="70%" | ----
+
| width="70%" |  
 +
Ближайшая сущность к отправителю в его группе 
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_NEARESTINCOMM
-
| width="70%" | ----
+
| width="70%" |  
 +
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALFILTER_ANYONEINCOMM
-
| width="70%" | ----
+
| width="70%" |  
 +
Все сущности в радиусе коммуникации отправителя
|-
|-
-
| width="30%" | --
+
| width="30%" | SIGNALID_READIBILITY
-
| width="70%" | ----
+
| width="70%" |  
 +
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).
|}
|}
 +
 +
 +
== Прием сигнала ==
 +
 +
Действие, которое должно быть показано, когда получен сигнал, определяется в функции как следующая:
 +
 +
<source lang="lua">
 +
MySignalName = function(self, entity, sender)
 +
...
 +
 +
end
 +
 +
где
 +
self: это behavior сущности
 +
entity: сама сущность
 +
sender: отправитель сигнала
 +
</source>
 +
 +
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character: 
 +
 +
<source lang="lua">
 +
Behaviour1 = {
 +
    OnEnemySeen  = *Behaviour1*,
 +
    OnEnemyMemory = *Behaviour2*,
 +
    &#8230;
 +
    MySignalName  = *MyNewBehaviour*,
 +
}
 +
</source>
 +
 +
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.
 +
 +
 +
==Пример ==

Версия 17:37, 27 апреля 2012

Эта страница страница помечена как находящиеся в процессе перевода.


О статье
АвторAndreyFilantrop
СложностьСредняя
ТребованияТекстовый редактор, Crysis 2 Mod SDK.
Дата добавления25/04/12


Содержание

Сигналы

Краткий обзор

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*,
    &#8230;
    MySignalName  = *MyNewBehaviour*,
}

Это означает, что если character на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на «MyNewBehaviour».


Пример