Архитектура модели поведения NPC 1. Область применения Архитектура модели поведения NPC, которую я собираюсь представить Вашему вниманию, предназначена для игр, предполагающих высокую степень автономности поведения персонажей. То есть для таких жанров, как RPG, Action, симуляция жизни (The Sims) и, возможно, Adventure. Для игр стратегических жанров данная модель если и применима, то весьма локально. Строго говоря, предлагаемая модель реализует не искусственный интеллект (AI), а искусственную жизнь (AL). С ее помощью NPC может демонстрировать гибкое и разнообразное, но не обязательно оптимальное поведение. 2. Общая структура модели (слайд N1) Модель состоит из пяти основных блоков, которые сейчас будут описаны. 2.1.Physis. В этом блоке сосредоточены все физиологические (сила, реакция и т.п.) и психологические (агрессивность, храбрость и т.п.) характеристики NPC, его текущие состояния (здоровье, уровень энергии и т.п.) и мотивация (т.е. что он хочет и насколько сильно). 2.2.Memory. В памяти NPC хранится список критичных для его поведения объектов, которые он видит и список объектов, которые он не видит, но видел когда-то. Список невидимых в данный момент объектов имеет ограниченную длину и, по мере сбора новой информации, старая теряет актуальность и «забывается». 2.3.Predicator. Предоставляет информацию в основном о состоянии окружающей действительности и состояниях самого NPC. Служит для проверки возможности выполнения того или иного действия. Представляет собой набор предикатов, дающих ответ «да» или «нет» на какой-либо вопрос и, если этот вопрос связан с проверкой наличия в окружении объектов с определенными свойствами, формирующий список объектов, обладающих этими свойствами. 2.4.Deliberator. На основании информации, полученной от вышеописанных блоков, выбирает наиболее актуальное действие и дает рефлексору команду на его исполнение. 2.5.Reflexor. Этот блок занимается непосредственно исполнением команд таких как: идти куда-либо; напасть на противника; убежать от противника и т.п. Теперь рассмотрим подробнее каждый из блоков. 3. Physis (слайд N2) Итак, Physis состоит из постоянных параметров, описывающих «характер» NPC, переменных параметров, описывающих его внутреннее состояние и желаний, значения которых показывают, чего персонаж хочет и насколько сильно. Значения постоянных параметров задаются при создании персонажа и не изменяются на всем протяжении его жизни. Это могут быть сила, устойчивость к повреждениям, агрессивность, любопытство и т.д. Переменные параметры могут изменяться при каких-либо внешних воздействиях (например, здоровье, которое уменьшается при нанесении повреждения другим персонажем) или изменяться в зависимости от времени и совершаемых действий (например, уровень энергии может понижаться во время бега и восстанавливаться в спокойном состоянии). Как отдельный подвид переменных параметров можно выделить двойные параметры, составляющие зависимые пары. Сумма значений этих переменных всегда постоянна и эти значения как бы «перетекают» из одного параметра в другой и обратно с определенными скоростями. Такой механизм может быть полезен, когда есть необходимость в моделировании «инерционности» изменения интенсивности желаний. Рассмотрим пример (слайд N3). Имеется пара «Сытость – Голод» и переменный параметр «Уровень энергии», играющий роль катализатора. Допустим, скорость «перетекания» от сытости к голоду постоянна, а скорость обратной реакции прямо пропорциональна уровню энергии. В этом случае при медленном изменении уровня энергии голод и сытость будут меняться почти с той же скоростью. Но если энергия меняется резкими скачками, то изменения голода и сытости начинают ощутимо отставать. Так, в нашем случае, если персонаж находится посреди большого скопления пищи, он сможет съесть значительно больше, чем необходимо для восполнения энергии. Если же пища в окрестностях встречается редко, сытость успеет вырасти до того, как персонаж доберется до следующей порции и желание есть угаснет. Предположим, что персонаж размножается при переизбытке энергии. Тогда он будет успешно репродуцироваться при избытке пищи в окрестностях и не будет при недостаточной кормовой базе. На основании значений переменных и, возможно, постоянных параметров вычисляются текущие значения желаний персонажа (слайд N4). Желания в значительной степени определяют выбор персонажем той линии поведения, которую он будет демонстрировать. Интенсивность желания должна вычисляться только из параметров физиса. Например, желание напасть на кого-либо может быть равно среднему арифметическому от агрессивности (постоянная) и здоровья (переменная). Текущие значения желаний будут переданы делибератору. Поэтому значения желаний должны быть нормализованы. Т.е. колебаться в одном и том же интервале. 4. Memory (слайд N5) В памяти персонажа хранится информация об объектах, критичных для его поведения (другие персонажи, оружие, пища и т.п.), которые он видит в данный момент, и те, которые не видны, но о которых он знает (видел когда-то или ему кто-то об этом рассказал). Кроме ссылки на объект в памяти может храниться некоторая дополнительная информация. Как-то позиция, в которой этот объект последний раз видели, отношение к объекту и т.п. Более того, саму ссылку на объект хранить нежелательно. Лучше хранить некий уникальный идентификатор, по которому этот объект впоследствии можно будет найти. На очередном шаге главного цикла память опрашивает систему перцепции о наличии в поле зрения видимых объектов и помещает их в соответствующий список, либо обновляет информацию о них, если таковые уже находятся в списке видимых. Если в списке видимых наличествуют объекты, которые в данный момент видимыми быть перестали, они перемещаются в список запомненных. Список запомненных объектов разумно ограничить по размеру и, при превышении максимального размера, удалять из него самые старые по времени занесения объекты. Также необходимо не допускать попадания одного и того же объекта в оба списка удалять из списка запомненных те объекты, которые не были найдены в запомненном месте. 5. Deliberator (слайд 6) Делибератор, как можно понять из его названия – блок, «обдумывающий» необходимость и возможность совершения персонажем тех или иных действий. Основу делибератора составляет сеть предложений, описывающая последовательности действий, которые надо совершить для удовлетворения желаний. Рассмотрим пример (слайд 7). Допустим, что все поведение персонажа состоит в поиске и поедании пищи. На слайде показана сеть (хотя в данном примере это цепочка) предложений, реализующая такое поведение. Поскольку рассмотрение предложений осуществляется сверху вниз (по стрелкам) до тех пор, пока не выполнится условие текущего предложения, предписанные действия совершаются в обратном порядке. Из примера видно, какую последовательность действий персонаж должен совершить для удовлетворения своего желания есть. Если еды нет ни в руке, ни в поле зрения, NPC будет осуществлять поиск еды. Как только в поле зрения появится еда, персонаж направится к ней. Приблизившись на расстояние «рядом», он поднимет еду, после чего, в силу того, что еда окажется у него в руке, NPC съест еду. Рассмотрим структуру предложения (слайд 8). Предложение содержит в себе команду, которая может быть передана рефлексору. Поле «Сила мотивации инициализируется» предыдущим предложением или силой одного из желаний физиса, если данное предложение является одним из начальных. Если сила мотивации предложения к этому моменту уже определена при рассмотрении другой ветви, сила мотивации принимает наибольшее из двух этих значений. После инициализации проверяются условия. Если все предикаты истинны, отобранные объекты помещаются в результирующий список и переход к следующим предложениям не осуществляется. Если же хотя бы один из предикатов ложен, сила мотивации всех последующих предложений инициализируется немного (скажем, на 1%) уменьшенным значением силы мотивации текущего предложения, а собственная сила мотивации становится равной нулю, после чего начинается рассмотрение каждого из последующих предложений. Таким образом (слайд 9) в результате последовательного рассмотрения предложений в сети выбирается предложение с наибольшей силой мотивации и соответствующая команда вместе с результирующим набором объектов передается рефлексору для исполнения. Постепенное уменьшение силы мотивации приводит к тому, что при наличии нескольких желаний с примерно одинаковыми значениями будет выбрано то предложение, путь к которому наикратчайший. 6. Predicator По сути, это просто набор предикатов. Предикат представляет собой класс, умеющий отвечать «да» или «нет» на какой-нибудь вопрос (например «Вижу ли я врага?»). При положительном ответе, если вопрос предполагает наличие какихлибо объектов, предикат также формирует список всех подходящих объектов. За информацией предикат может обращаться к памяти, рефлексору и физису NPC, обращение непосредственно к окружению нежелательно. 7. Reflexor Блок, умеющий выполнять команды, получаемые от делибератора. Рефлексор имеет доступ к набору навыков, каждый из которых умеет выполнять какое-то одно действие (например, идти по маршруту, драться, убегать от врага и т.п.). При получении новой команды рефлексор отыскивает соответствующий навык (или несколько навыков, выполняющихся последовательно) и активизирует его. Если для выполнения команды требуется несколько навыков, активизируется первый, а остальные ставятся в очередь. Каждый навык может иметь конечную цель, при достижении которой рефлексору посылается сообщение о завершении действия. В этом случае активизируется следующий навык в очереди, а если очередь пуста, активизируется некий дефолтный навык. Если, при получении новой, отличной от текущей, команды, имеется активный навык, он прекращает выполнение и очередь навыков очищается.