Учебник Bethesda Пакеты

Навигация

Материал из Creation Kit Русский
Перейти к: навигация, поиск
Учебник Bethesda Пакеты
Серия Промежуточный Дизайн Квестов, глава 1
Вернуться в Учебный центр
LeftArrow.png Предыдущий учебник Следующий учебник RightArrow.png


Обзор

Этот учебник покажет читателю как настраивать пакеты (структуры данных, управляющие поведением актера) для актера, чтобы заставить его передвигаться по миру.

Вы узнаете:

  • Как работают пакетные стеки
  • Как создать простое ежедневное расписание дня для NPC
  • Как создать новый пакет

Пакеты и Пакетные стеки

Пакет - это термин, использующийся в Creation Kit для структуры данных, которая управляет поведением актера. В любой момент времени, актер одновременно может выполнять один и только один пакет, который и сообщает актеру, что ему делать - спать, есть, бродить вокруг, следовать патрульному маршруту, работать в кузнице и др.

Так откуда актер знает, какой пакет он должен начать выполнять в любое заданное время? Тут приходит на помощь Package Stack. Основная идея которого состоит в том, что каждый актер имеет стек пакетов, которые он может выполнять. Игра периодически запускает пакеты по списку, начиная с пакета, находящегося в верхней части стека, и проверяет каждый пакет по одному за раз, чтобы определить, какой из них соответствует заданным условиям в данный момент времени. Пакет является действительным, если:

  • Его условия определяются как true, и
  • Текущее время дня попадает в рамки, указанные в его расписании.

Актер всегда выполняет первый соответствующий условиям пакет из стека. Актеры, располагающиеся около игрока, будут очень часто пересматривать свой стек пакетов; актеры в не загруженной области игрового мира, соответственно реже.

Создаем простое расписание

Итак, давайте посмотрим, как эти идеи работаю на практике, дадим нашему старому другу Бенду Оло расписание. (Завершите учебник по созданию актера перед тем, как идти дальше.)

Откройте GSQBenduOlo и перейдите на вкладку AI Packages, которая в данный момент выглядит так:

Package Tutorial PackageList.png

Так как он не имеет ни одного пакета в списке, то он весь день будет стоять на месте. Итак, давайте заставим его что-то делать, чтобы он был больше похож на человека.

Чтобы добавить пакеты актеру, вы можете щелкнуть правой кнопкой в списке AI Package List и выбрать "Add", или перетащить в этот список нужный пакет из окна Object Window. Давайте сделаем последний вариант - щелкните по Package в списке объектов (находящимся в секции Character). Пролистайте до пакетов, начинающихся с "Default...". (Это соглашение по именованию, которое мы используем для обозначения пакетов, которые не привязаны к конкретным местам в мире, и таким образом они могут использоваться любым актером.)

Package Tutorial DefaultPackages.png

Мы можем создать для Бенду простое расписание, используя эти, уже готовые пакеты. Итак, давайте сообщим ему, что мы хотим, чтобы он завтракал и ужинал дома, спал по ночам, или же просто болтался вокруг по его дому.

Для еды, давайте посмотрим существующие по умолчанию "eat"(кушать) пакеты - возьмите DefaultEatEditorLoc8x1 (завтрак) и DefaultEatEditorLoc18x1 (ужин). Примечание: мы используем соглашение по именованию пакетов чтобы указать, которые из них имеют расписание: "ВРЕМЯНАЧАЛАxДЛИТЕЛЬНОСТЬ". Поэтому "8x1" указывает, что пакет будет запускаться в 8 утра и длиться 1 час; "18x1" указывает, что пакет будет запущен в 6 вечера, и также будет длиться 1 час. Но, конечно, именование может быть и неправильным - давайте проверим фактические данные в пакетах, чтобы убедиться, что их расписания соответствуют их именам. 1 час в игре длится 3 минуты реального времени (20 минут игрового равно 1 минуте реального; 24 часа эквивалентно 72 минутам реального).

Теперь, откройте оба эти пакета, и перейдите на вкладки Schedule, которые выглядят так:

Package Tutorial DefaultEatEditorLoc8x1.png


Их имена не врут - эти пакеты верны для того времени, на которое мы и рассчитывали. Замечательно, теперь добавим их в список пакетов Бенду Оло, который сейчас будет выглядеть так:

Package Tutorial PackageList2.png

Теперь, как мы обсуждали ранее, в списке пактов важное значение имеет их порядок, так как актер всегда выполняет удовлетворяющий условиям пакет начиная проверку сверху списка - вниз. Что касается этих двух пакетов, то здесь это не играет значение, потому что они не могут удовлетворять условия в одно и то же время - если время между 8 и 9 утра, пакет DefaultEatEditorLoc8x1 действует; если же между 6 и 7 вечера, то DefaultEatEditorLoc18x1 действует; в другое время ни тот ни другой пакет не будут действовать. Так что порядок пакетов в этом случае не играет роли. Но будьте внимательны - мы добавим следующий пакет в список Бенду Оло, и уже здесь порядок будет играть решающее значение, чтобы его расписание работало правильно.

Мы говорили что хотим, чтобы он спал ночью, поэтому давайте найдем пакет отвечающий за сон в списке пакетов, начинающийся с "default" - возьмите пакет DefaultSleepEditorLoc1x8, который, на самом деле, не является лучшим примером, но зато помогает проиллюстрировать важность порядка стека в списке пакетов.

Если вы обратили внимание, то наверное поняли, что этот пакет действителен с 1 ночи до 9 утра, и попадает на пакет завтрака Бенду (DefaultEatEditorLoc8x1), который действителен с 8 до 9 утра. Так что вот где порядок в стеке начинает играть значение.

Achtung.png AM(лат. Ante meridiem) - время до полудня, PM(лат. Post meridiem) - после полудня, например 6pm это 18 часов и т.п.

Скажем мы перетащили пакет сна в верхнюю часть списка Бенду, как на картинке:

Package Tutorial PackageList3.png

Поскольку верхний действительный пакет в списке имеет "приоритет" над остальными, в 8 утра Бенду будет продолжать выполнение пакета сна - пакет же еды находится ниже его в стеке и поэтому никогда не будет запущен, даже если текущее время соответствует указанному у него в условиях.

Чтобы он тоже работал, все что нам нужно сделать, это разместить пакет сна ниже пакета с завтраком в списке Бенду, вот так:

Package Tutorial PackageList4.png

Protip.jpg Чтобы передвинуть пакет в стеке, используйте кнопки Larr button.png и Rarr button.png

Теперь он будет выполнять свой пакет DefaultSleepEditorLoc1x8 в 1 час ночи, как мы планировали - это единственный действительный пакет в это время. Когда наступит 8 утра, Бенду переключится на пакет DefaultEatEditorLoc8x1, потому что сейчас это действительный пакет, находящийся выше в стеке - поэтому Бенду будет спать 7 часов вместо указанных 8 в пакете сна, но зато он не пропустит завтрак.

Теперь у нас есть хороший распорядок дня для Бенду - он ест 2 часа в день, и спит 7. Мы бы и дальше могли заполнять его день пакетами с расписанием, но в большинстве случаев, лучше будет сделать ему пакет "на всякий пожарный", который будет запускаться, когда ни один другой не действителен. Этот пакет не должен содержать условий, и расписания, поэтому он всегда действителен - и поэтому, он должен находиться в самом низу списка пакетов.

Для этих целей мы часто используем пакет Sandbox - он позволяет NPC двигаться в пространстве, выбирая полу-случайным образом, что делать. Это очень полезно, когда мы не особенно волнуемся о том, что NPC делают, но хотим, чтобы они продолжал вести себя естественно.

Для наших целей, хорошим выбором будет пакет DefaultSandboxHomeowner. Давайте откроем его и посмотрим на его данные:

Package Tutorial DefaultSandbox.png

Его поле "Location" указывает на "Near editor location, radius 1500" - это значит что он будет использовать пакет "sandbox" около точки, в которую он был помещен в редакторе, в радиусе 1500 единиц (которого, как правило, достаточно, чтобы покрыть небольшой интерьер здания). Если вы посмотрите на другие стандартные пакеты в списке Бенду, вы заметите, что все они тоже используют "Near editor location" - потому что они не указывают точное место в мире, они могут быть использованы любым актером.

Бенду ужинает куском хлеба, который откуда-то достал

Другая полезная возможность этого пакета - "Unlock On Arrival = True". Это означает, что всякий раз, когда актер выполняет этот пакет, он будет открывать двери в своем помещении, что хорошо, так как он должен давать квест - мы ведь не хотим, чтобы он скрывался за запертой дверью.

Вы можете пройтись по вкладкам Conditions и Schedule чтобы убедиться, что они не содержат условий, и нет конкретного расписания, для того, чтобы пакет всегда был действителен (чего мы как раз и хотим).

Итак, поместите этот пакет в список пакетов Бенду, в самый низ. Теперь у него есть готовое, простое расписание на день:

Package Tutorial PackageList5.png

Если вы хотите увидеть его в действии, запустите игру и переместитесь к Бенду:

coc MixwaterMillWorkersHouse

Чтобы понаблюдать за разным поведением, вы можете изменять время суток в игре:

set gamehour to 2

Теперь у него есть несколько простых поведений - есть/спать/бродить, которые будут выполняться внутри "его" дома. Если он не захочет спать и попросит вас покинуть помещение, вы можете использовать команду toggledetection, чтобы он игнорировал игрока.

Создаем новый пакет

Мы посмотрели как использовать существующие "стандартные"(default) пакеты для построения расписания дня. А как на счет того, чтобы сделать новый пакет, конкретно для Бенду? Допустим, мы хотим, чтобы он патрулировал экстерьер вокруг своего дома в определенное время в течение дня.

Во-первых, создайте новый пакет, кликнув правой кнопкой мышки в списке пакетов окна Object Window и выберите "New". Вам откроется пустое окно пакета, которое выглядит вот так:

Package Tutorial NewPackage1.png

По-умолчанию выбран шаблон Travel(путешествие) - но мы хотим сделать патрулирование, поэтому из выпадающего списка выберите Patrol. Обратите внимание, что список Package Data изменился - шаблону Patrol необходимы иные данные, чем шаблону Travel. Теперь у нас есть пустой пакет по шаблону Patrol, давайте заполним некоторые данные для конкретного пакета для Бенду:

Package Tutorial NewPackage2.png

На странице процедуры Patrol подробно описаны данные этого пакета. На данный момент, единственное, что нам нужно указать в этом пакете:

  • Patrol Start - когда Бенду должен начать патрулировать маршрут?
  • Schedule - в какое время дня он должен использовать этот пакет?

Мы еще не сделали патрульный маршрут для Бенду, так что давайте загрузим экстерьер и создадим простой маршрут для него. (Если у вас загружен интерьер, сделайте двойной щелчок по желтому маркеру двери, и вы быстро переместитесь в экстерьер у входной двери; а если идти по другому пути, то загрузите ячейку MixwaterMillExterior в списке ячеек игрового пространства Tamriel.)

Если вы не знакомы со связанными между собой ссылками, то учебник о неожиданных встречах будет отличным началом для знакомства с ними. А сейчас давайте просто создадим быстрый 3-точечный маршрут патрулирования:

  1. Перетащите XMarkerHeading в окно render window.
  2. Дважды дублируйте его используя комбинацию клавиш CTRL-D.
  3. Расположите 3 маркера так, чтобы создать наиболее хороший маршрут для патрулирования, затем свяжите их вместе, используя вкладку Linked Ref у каждого из маркеров.

В итоге вы должны получить что-то вроде этого (точное местоположение маркеров патрулирования не имеет значения):

Package Tutorial NewPackage3.jpg

Теперь, в окне Package, выберите в списке Patrol Start и щелкните по кнопке справа (первоначально она будет называться "Linked Ref". Это позволит вам выбрать данные для начальной точки патрулирования (Patrol Start) - нажмите радио кнопку "Specific Reference"и выберите один из только что созданных маркеров патрулирования (какой именно не имеет значения, потому что они связаны между собой по кругу).

Package Tutorial NewPackage4.png

Второе, что нам нужно сделать, указать когда Бенду должен использовать этот пакет (в противном случае это единственное, что он будет делать, когда мы ставим ему стек пакетов). Перейдите на вкладку Schedule в окне package, и, скажем, что он должен ходить вне дома утром между 10am и 12pm:

Package Tutorial NewPackage5.png

Единственное, что осталось сделать, это дать имя пакету - назовем его GSQBenduPatrol10x2, соответствуя стандартным правилам именования. Нажмите OK чтобы закрыть это окно, ну вот и закончили создание нового пакета.

Теперь после того, как мы создали новый пакет, нам нужно добавить его в список пакетов Бенду, для того, чтобы реально изменить его поведение. Найдите наш новый пакет в секции Package окна Object window, и перетащите его в список AI Package List нашего Бенду. По-умолчанию, все новые пакеты размещаются внизу списка пакетов, но мы хотим, чтобы этот пакет находился в верху списка (или по крайней мере над пакетом DefaultSandboxHomeowner - иначе он никогда не будет работать, потому что пакет DefaultSandboxHomeowner всегда действителен). Используйте кнопку Larr button.png чтобы передвинуть его в верхнюю часть стека Бенду:

Package Tutorial NewPackage6.png

Нажмите OK чтобы закрыть окно актера Бенду и сохраните ваш плагин. Теперь зайдите в игру и посмотрите как Бенду будет патрулировать окрестность:

coc MixwaterMillExterior
set gamehour to 10

Вот и все - теперь вы знаете как настраивать существующие пакеты для актеров или создавать и использовать новые. В большинстве случаем, готовые Шаблоны Пакетов будут предоставлять всю необходимую функциональность. Но, если вам вдруг понадобилось более конкретное поведение, вы даже можете создать ваш собственный Шаблон Пакета.


LeftArrow.png Предыдущий учебник Вернуться в Учебный центр Следующий учебник RightArrow.png