Перейти к содержимому


Информация о статье

  • Добавлено:
  • Обновлено:
  • Просмотры: 6750
  • Автор: Dimonoider

 


* * * * *
7 Рейтинг

Creation Kit: IdleMarkers — От создания до расширения имеющихся

Написано в Янв 08 2014 11:25

Минутка словоблудия

 

     Для работы ИИ (Искусственного интеллекта) в игре используется NavMesh. После создания навмешей для NPC требуются AI пакеты, которые сделают его «живым» (Вкладка AI Packages в меню Actor). Каждому NPC лучше прописывать определенный набор Default пакетов, наиболее важным из которых будет является Sandbox пакет (DefaultSandboxLocEditor1024 – например).
     Приписав персонажу пакет, вы увидите, как тот бродит с места на место, пьет и закусывает. Для того, чтобы как-то разнообразить жизнь актера, используется фурнитура (WorldObjects/Furniture/...) и набор маркеров, таких как IdleMarkers.

 

 

А теперь к делу

 

     Для начала разберемся, что за зверь такой этот IdleMarker. В словоблудии уже говорилось, что эти маркеры позволяют разнообразить поведение NPC в какой-либо локации. Более того, они позволяют, не прибегая к скриптам и сценам создавать модель поведения NPC  в разное время суток, но это уже зависит от AI-пакетов. Именно благодаря IdleМаркерам стражники патрулируют улицы городов, а Драконий Предел ежедневно очищается от пыли и мусора двумя безустанными служанками. Сами по себе IdleМаркеры наследуют анимации, заложенные для каждого NPC. К сожалению, не все анимации пригодны для использования в маркерах, но самое главное не это, а то, что десятки анимаций так и небыли использованы разработчиками игры. Теперь, когда дело сказано, можно приступить к поэтапному разбору и созданию IdleMarker'a.

 

 

Создание IdleMarker'a на основе доступных анимаций

 

     Откроем ObjectWindow > раздел Miscellaneous > IdleMarker. Здесь мы видим список из уже доступных маркеров:

 

1.png

 

 

     Жмем правой кнопкой мыши по этому пространству и создаем новый IdleMarker. Перед нами появляется окно IdleMarker:

 

2.png

 

     Тут стоит остановиться на каждом из параметров окна:

  1. Поле Marker Model – его трогать не стоит. Модель маркера уже заложена и будет использоваться в окне рендера;
  2. Child Can Use – могут ли дети использовать маркер;
  3. Ignored By Sandbox – будет ли маркер игнорироваться актерами (применимо в ситуациях, когда маркер выполняет специальную анимацию для какой-либо сцены в каком-либо квесте;
  4. Do Once – маркер будет использован один раз;
  5. Поле Idle Timer Setting – настройка времени выполнения данного маркера. Не все маркеры могут быть настраиваемы этим параметром;
  6. Пункты Random и Run In Sequence отвечают за случайное или последовательное выполнение IdleАнимаций в случаях, когда ваш маркер содержит сразу несколько анимаций;
  7. Этими стрелочками можно регулировать порядок распределения маркеров в списке, соответственно изменять последовательность их выполнения (не забываем про пункт 6).

 

     Разобравшись со свойствами окна, переходим к добавлению новой анимации в наш маркер. Нажимаем на пустое поле правой кнопкой мыши и выбираем New. Перед нам окно Select Idle. Мы видим список всех IdleАнимаций, доступных для использования в IdleМаркерах, кроме того есть поле выбора актера и окно просмотра:

 

3.png

 

 

     Выберем себе актера, для которого нам нужно получить список анимаций. Обратите внимание, при смене актеров меняется и список. Вы можете упорядочить список по имени или ID. По умолчанию список упорядочен по дате:

 

4.png

 

5.png

 

 

     Я выбрал Ульфрика Буревестника и получил список доступных анимаций. Обязательно учтите следующее:

  • Список анимаций идентичен для всех играбельных рас, в том числе детей. Для всех пауков, к примеру, будет одинаковый список состоящий из нуля доступных анимаций.
  • В данном списке содержатся где-то 250-300 анимаций. В IdleМаркерах применимы лишь 150. Как правило все они начинаются со слова Idle.
  • Многие анимации не будут проигрываться актерами. К этому нужно привыкнуть и смириться. Вероятно, это есть баг самой системы IdleМаркеров.
  • Все анимации добиваний (около 80) можно найти в этом списке. К сожалению при их исполнении актеры не используют оружие из инвентаря. Они просто машут руками.
  • Не возвращайте окно выбора Актера в позицию NONE – это приводит к вылету редактора.
  • Вероятно, в превью-окне должен был работать рендер самой анимации, дабы вы не включали по 100 раз игру для тестирования. Увы, что сломано, то сломано.
  • Некоторые анимации имеют начало, зацикленную часть выполнения и конец. Используйте либо начальную, либо срединную фазу (в названии анимации слова Start\Enter и Instant).
  • Некоторые анимации наследуют объекты, такие как кинжалы, бутылки, чашки, метла. Добавлять их в инвентарь самому персонажу не нужно. Однако, например анимация чистки меча наследует оружие из инвентаря актера.

 

     Для примера я выбрал анимацию IdleAstrid (Финальная миссия за Темное Братство, обгоревшее тело Астрид «распято» на полу). Далее жмем OK. И выбираем место для своего маркера:

 

6.png

 

 

     По быстрому я собрал прототипную ячейку, не забыл про сетку путей, Ульфрика и сам маркер:

 

7.png

 

 

     В результате Ульфрик подходит к маркеру и растягивается на полу:

 

8.jpg 9.jpg 10.jpg

 

 

     Не находите это немного скучным и не обыгранным? Так давайте изменим окружение под этот маркер:

 

11.jpg

 

 

     И вот сцена преобразилась, она уже может поведать какую-то историю. Ульфрик Буревестник стал жертвой имперского произвола, либо у Авентуса Аретино появились новые заказы для Темного Братства. Первый этап пройден.

 

 

Расширение списка доступных IdleАнимаций для использования их в системе IdleMarker

 

     А что если нам мало стандартных анимаций? А есть ли другие анимации? Давайте разбираться. На верхней панели найдите Gameplay, далее Animations:

 

12.png

 

 

     Перед нами окно Idle Animations. Здесь мы видим каталоги с анимациями для разных типов существ, в том числе для фурнитуры и активаторов:

 

13.png

 

 

     Запомним это место. Теперь нам необходимо выбрать анимацию, которую мы хотим использовать в качестве IdleМаркера. Для этого откроем в окне Object Window наших NPC. (Actors > Actor):

 

14.png

 

 

     Находим своего актера, открываем, переходим на вкладку Animation (список анимаций также доступен через Preview Window):

 

15.png

 

 

     Тут работает рендер анимаций. Все, что нам нужно - это выбрать себе анимацию по вкусу. Естественно лучше искать среди анимаций, начинающихся со слова Idle. Изначально я выбрал анимацию шатающейся пьяной походки (А такая есть и  нигде не используется, сюрприз да?), но она не сработала на IdleМаркере. Поэтому возьмем анимацию написания письма пером в сидячем положении (Два сюрприза за день – да вы везунчик!):

 

16.png

 

 

     Теперь запомним ее название. В моем случае это IdleWriteTableChairIdle.hkx. Название нужного нам AnimEvent’a будет примерно таким же. Возвращаемся к окну Idle Animations. Итак, нам нужен набор анимаций для «разумных рас». Это каталог Actors\Character\Behaviors\0_Master.hkx:

 

17.png

 

 

    Тут мы видим много подкаталогов с различными действиями для игрока. Ничего не трогаем, листаем вниз до папки LOOSE:

 

18.png

 

 

     Открыв эту папку, мы видим до боли знакомую картину – тот самый список анимаций, доступных при создании IdleМаркера (разве что сортировка алфавитная). Жмем куда-нибудь в это место правой кнопкой мыши > Insert Child. Получаем новую анимацию, без имени. (отображение вверху списка), придумываем ей ID:

 

19.png

 

 

     В самом окне имеются дополнительные параметры:

  • Sequence, Blocking, No attacking не трогаем. Они не используются в данном разделе.
  • Looping Seconds используется для задания цикличности выполнения действия.
  • Replay Delay – задержка перед повторным выполнением анимации.
  • Conditions – пропишите условия для выполнения анимации. Тут вы ограничены только свей фантазией. Можно поставить зависимость от чего угодно (погода, пол, раса, уровень и еще десятки условий – все зависит от вас).
  • AnimEvent – само окно для выбора анимационного события:

20.png

 

 

     Начинаем искать нашу анимацию. Мы видим действие IdleWriteTableChairEnterInstant. То, что нужно. Кстати, там еще есть анимации для разных типов кресел: будь то с левосторонним «входом» или правосторонним. Нам же не принципиально. Заметьте, название AnimEvent'a и Havok Анимации не совпадает, но очень похоже:

 

21.png

 

 

     Выбираем нужную анимацию, нажимаем Close. Открываем свой IdleMarker. Нажимаем New. Получаем список доступных анимаций. Находим там свою IdleАнимацию:

 

22.png

 

 

     Дважды кликаем по ней, сохраняем маркер и если он у вас уже где-то размещен – смотрим результат в игре:

 

23.jpg 24.jpg 25.jpg

26.jpg 27.jpg 28.jpg

 

 

    И вот вроде бы все хорошо. У Ульфрика появилось письмо, он старательно выводит на нем пустоту что пишет. Но. Где стул? А где плавная анимация посадки на этот стул? Непорядок. Давайте разбираться:
    Как видите, иногда приходится «помогать» IdleАнимациям нормально выглядеть. Можно было бы подставить какую-нибудь табуретку или камень для Ульфрика, но это не профессиональный подход.
    Итак, нам нужно заставить Ульфрика проиграть IdleАнимацию тогда, когда он сядет за стул. Определенный стул, а не кровать или скамейку:

 

29.png

 

 

     Для этого нам нужен сам Ульфрик. Открываем его как Reference самой локации, переходим на вкладку Scripts и создаем новый скрипт (Add > New > «Вводим название» > OK). Затем правой кнопкой по нему > Edit Source:

 

30.png

 

 

     Открывается текстовое окно, там мы видим только: Scriptname (Имя вашего скрипта) extends ObjectReference

 

     Сменяем ObjectReference на Actor и полный скрипт выглядит так:

Scriptname (Имя вашего скрипта) extends Actor

 
Idle property AnimIdle auto
ObjectReference property Chair auto


Event OnSit(ObjectReference akFurniture)
     If akFurniture == Chair
          PlayIdle(AnimIdle)
     EndIf
EndEvent

     В данном случае, как только Ульфрик использует фурнитуру (OnSit), при условии, что наша фурнитура  - нами выбранное кресло (Chair), проигрывается наша IdleАнимация (AnimIdle). Нажимаем  File > Save. Скрипт скомпилирован. Остается дать скрипту знать, какую фурнитуру ему нужно учитывать, и какую анимацию проигрывать:

     Дважды кликаем левой кнопкой мыши по имени скрипта / правой кнопкой мыши по названию > Edit Properties. Выбираем наше AnimIdle. В окне Pick Object мы видим тот самый список анимаций, доступных только для IdleМаркеров, в который мы занесли новую. Затем в Chair выбираем наше кресло.

 

31.png

 

 

     Проверим в игре:

 

32.png

 

 

     Ульфрик садится в кресло, достает пергамент и начинает писать. Великолепно! Сцена обыграна логично (Стол выберете сами).

     Гениальность системы искусственного интеллекта Скайрима в том, что он не станет заставлять NPC 100% выполнять вашу анимацию, если его не попросить. Как видите пока один Ульфрик пишет, второй закусывает, а третий запивает:

 

33.jpg

 

 

Минутка словоблудия

 

В Скайриме зашито множество анимаций, пригодных для использования IdleМаркерами. Почему разработчики их не использовали? Мы не знаем, но ничто не мешает вам использовать эти анимации не только для скриптовых сцен, но и для обычных ситуаций и локаций так, чтобы они стали необычными. 

Вот небольшой список (далеко не полный) Havok Анимаций (просмотр во вкладке Actor), которые не найти в повседневном Скайриме, либо их использовали единожды (Даю начало названия, каждая анимация имеет два-три варианта или стадий исполнения):

Анимации