SED3.5 - поведение врагов, их расстановка, усложненные спауны


*примечание: в этой статье все описано именно таким образом, каким представляет себе эти вещи автор; некоторые термины, что особенно касается части про скрипты, могут быть употреблены некорректно; прошу не кидаться тапками*

Всем привет!

В предыдущей статье я довольно поверхностно описал процесс создания монстров и их телепортации на карту. Но нельзя просто бросать бойцов на поле боя таким образом - их появление должно быть эффектным и эффективным.  

Построение

Для начала, давайте разберем, как ставить их (вернее, точки их телепортации) в строй. Есть у спаунеров такой параметр, называется Spawn formation, он-то нам и нужен. Этому параметру можно присвоить один из 5 видов построения - шеренга (Line formation), строй в форме буквы "V" (V formation), прямоугольник-"коробка" (Rect formation), дуга (Pie slice formation) и строй по маркерам (Weighted markers formations). У каждого строя есть как общие параметры (их пять), так и свои, уникальные. К общим относятся:  

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

Randomize order - случайный порядок появления.

Invert facing - разворачивает новорожденных на 180 градусов.

View formation - отображать ли строй в редакторе, или будете ставить вслепую? Не вижу смысла отключать эту опцию, разве что временно для спаунеров, которые уже настроены и в дальнейшем лишь мешают своими синими полями и желтыми квадратиками.

Full random - спаун без какого-либо порядка, в случайных точках строя.

Теперь - об уникальных параметрах каждого строя. Все они определяют размер (и форму) строя.

Line formation имеет только один параметр - длина шеренги.

V formation - угол между лучами и их длина.

Rect formation - максимальные и минимальные длина и ширина.

Pie slice formation - угол дуги (при угле 360 замыкается в кольцо), максимальный и минимальный радиус.

Weighted markers formations - тут все более запутанно. Параметры собраны в свиток Formation markers. В нем есть два параметра:

Random order - случайный или нет порядок.

Closest to player - отдавать ли предпочтение маркерам, наиболее близко расположенным к игроку. (после прочтения нескольких строк ниже попробуйте догадаться, как сделать наоборот :)) и свиток Weighted formation markers. В этом параметре перечилсаются маркеры, а также указывается их "вес". Сами маркеры лежат в папке Tools вкладки EntityList, и называются они - угадайте, как? - верно, Formation marker.Самим маркерам можно задавать свой собственный строй (в том числе и сам Weighted markers formation; да-да, рекурсия, как бы :)), и настраивать их так же, как и в самом CSpawnerEntity.

Последний вариант строя удобно использовать, когда враги должны появляться с нескольких сторон, а геометрия карты не позволяет просто растянуть строй по всей карте, либо надо разбросать стрелков по позициям, а создавать для каждой позиции новый CSpawnerEntity лень.

В качестве примера приведу скриншот с одной карты. (сделанной Promos1 и скинутой мне на правку и доработку скриптов, спаунов и освещения). 

Довольно наглядный пример - над стенами расставлены маркеры для гнааров и клиров (они умеют перепрыгивать стены при рождении - об этом ниже), на крышах - для стрелков-арахноидов, и расставленные по всей карте и занимающие ее половину маркеры со своим строем для пауков - ведь накрыть всю карту строем Rect formation мне мешают дома, в которых могут застрять пауки сразу после выкапывания из-под земли (об этом тоже ниже). И ведь здесь использовано только по одному спаунеру для каждого типа врагов.  

Маршрут и тактики.

Зачастую просто бросать монстров перед игроком - признак дурного тона, ведь несколько лучше будет выглядеть, если враги выбегут из-за углов, выпрыгнут из-за стен, прилетят по воздуху, сделав крюк вокруг горы, приползут со стен и потолков, в конце концов. Для реализации этого потребуются обьекты Tactic и Path marker.

Tactic Определяет поведение персонажей.

Character mover - здесь задается тип поведения. Я не буду расписывать каждый тип потому что сам не разобрался. Некоторые из типов движения могут иметь свои параметры.

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

Tactic marker - сюда задается обьект Path marker. Используется в тактиках, предпологающих движение по маршруту, используя маркеры.

Auto off time - спустя N времени, данная тактика отключается и используется указанная в Next tactic, если таковая есть.

Auto off distance - подойдя к игроку на дистанцию N, тактика отключается.

Stop tactic when has foe - отключать тактику, когда определен враг. Целесообразно использовать с типом Ordered moving using markers, чтобы в нужный момент прервать движение персонажа и направить его в атаку (по тактике в Next tactic, если таковая имеется)

Color - цвет обьекта в редакторе. Полезно, чтобы различать определенный CTacticProperties среди остальных.

Path marker Точка, по которой проводится маршрут. 

Next marker - следующая точка маршрута.

Color - цвет маркера в редакторе, опять же, таким образом стоит выделять один маршрут среди других.

Итак, чтобы заставить персонажа двигаться по маршруту, необходимо указать ему Tactic с типом Ordered moving using markers и первый маркер маршрута. Это делается в параметрах Tactic и Tactic marker соответственно. Думаю, вы заметите, что маркер можно указать как и самому персонажу, так и обьекту Tactic. Таким образом можно отдать приказ на движение нескольким разным типам персонажей, но по индивидуальному для каждого из них маршруту.

Навигация

А помните, как в еще классическом Serious Sam, нередки были случаи, когда монстры упирались в стенку и ничего не могли поделать, пока игрок сам ее не обойдет? И здесь может произойти то же самое, если не создать такую замечательную вещь, как Navigation mesh, то бишь, навигационная сетка.

Навигационная сетка делается так:

1. Создаем модель (жмем кнопки Insert, E, затем справа выбираем вкладку Create). Модель типа Terrain подойдет.

2. Растяните модель так, чтобы она покрывала всю карту, или, по крайней мере, играбельную ее часть.

3. Теперь в местах, которые персонажи должны обходить, удалите полигоны. (желательно, конечно, чтобы их было много и удалять их можно было точнее -  используйте Subdivide из вкладки Add, если вы не увеличили число полигонов при создании модели).

4. Далее внизу-справа, перейдите в режим Polygon maps (кнопка PM), и выберите тип карты Navigation (кнопка N), создайте новую полигональную карту.

5. Из Layer Maps (кнопка LM) удалите карту Rendering 1.

6. Теперь во вкладке Layer выберите ваш Navigation map (в свитке Polygon maps), и параметру Navigation info присвойте значение Walkable area.

7. Перейдите в World Editor и нажмите B, чтобы сгенерировать навигационную сетку.

После этого, чтобы проверить, правильно ли сделана сетка, поставьте из категории Test два обьекта Navigation path test так, чтобы между ними было предусмотренное в нав. сетке препятствие, и нацельте один тестер на другой - должна появиться белая кривая линия с фиолетовыми шариками в точках изгиба, огибающая препятствие на пути ко второму тестеру. Теперь можно даже и не ставить маркеры маршрутов - просто поставить всем персонажам в параметре "Threat sensitivity" значение "Infinte sense", и они сами найдут противника и добегут до него, обходя предусмотренные навигационной сетью препятствия.  

Пример уже готовой навигационной сети; персонажи будут обходить "пустые" области сети, которые обводят дома и стены.  

 Примечание: хотя сетку можно сделать грубо, просто удалив полигоны в  недосягаемых местах, стоит быть немного аккуратным и повторять форму  препятствий, двигая вертексы.

Выход на сцену

Все же, если вы хотите, чтобы враги выскакивали прямо перед носом, желательно делать это эффектно. Первое и самое важное - они не должны просто появляться из воздуха, то есть не ставьте в таких случаях в Spawn effect параметр False, ибо это выглядит убого и дает -100500 к впечатлению от вашей карты. Иногда хватает просто включить Spawn effect (можно и поставив Only if visible).

Но некоторые персонажи имеють свои фишки. (к тому же, это редкие случаи, когда вышеупомянутый параметр False ставить надо)

Например, гнаары и клиры умеют перепрыгивать стены. Для этого надо поставить их спаунеры прямо над стеной, а в Appear animation прописать для гнаара "JumpOverWall_Start", а для клира "JumpOverWall".

Пауки умеют выкапываться из-под земли. Для этого, пропишите им в Appear animation строку DigOut.

У красных биомеханоидов есть анимация RiseFromSand, использованная в десятом уровне кампании. Она не приспособлена для использования в Appear animation, но можно прописать ее туда, зарыв биомеха в землю или песок, а при его спауне искуственным образом пустить эффект пыли (Particle effect с эффектом WalkerRiseDust.pfx, см. десятый уровень BFE).

Те же гнаары и клиры, прыгая вниз, автоматом включают нужную анимацию, им ничего не надо прописывать, главное убедиться, что они могут спрыгнуть вниз.  Примечание: Специальная анимация клира, использованная в первом уровне  кампании (перед входом в музей, клиры выпрыгивали из окон) -  Intro_Jump_All (сначала рык, потом прыжок), и Intro_Jump(сразу прыжок).  Анимация начинается выше спаунера примерно на 14 метров, и оканчивается  на несколько метров впереди спаунера.

А еще есть параметр Intro animation и Intro marker. Суть такова: если у персонажа прописана анимация в Intro animation (кроме дефолтной Intro) и указан маркер, то он будет идти строго по маршруту, заданному маркером, используя указанную анимацию. Это можно использовать, чтобы, например, пускать (опять же =/) клиров вниз по стенам (анимация WalkSneak).

 На заметку: Вкратце про параметр Launcher. Он заменяет комбинацию из  респаунера и Bouncerа под ним в классическом SS. То есть при спауне он  запускает новорожденных в воздух. Регулируются траектория, направление и  сила запуска.

Скрипты

В прошлой статье я лишь упомянул функцию-"фильтр" On(), а в пример приводил простейший скрипт, который ну нельзя просто использовать на серьезной карте. "Шаблон" для усложненных скриптов следующий:  

RunHandled( --начало конструкции RunHandled()
function()
--сюда впишите команды, которые будут выполнены сразу при старте скрипта
WaitForever()
end,
--сюда вписывайте функции-фильтры
end
) --конец конструкции RunHandled()

Для чего нужна эта конструкция RunHandled(), я сейчас обьясню. Первая функция в конструкции выполняется сразу, как видим, в конце функции вызывается WaitForever(), и скрипт переходит в ожидание. Т.е. далее скрипт управляется фильтрами On() и OnEvery(). Пример использования скрипта с конструкцией RunHandled()

RunHandled(
function()
gnaar:SpawnMaintainGroup() --сразу включаем гнааров
WaitForever()
end,
On(Times(5, Event(gnaar.OneKilled))), --на пятое убийство гнаара
function()
kleer:SpawnMaintainGroup() --включаем клиров
end,
On(Times(10, Event(kleer.OneKilled))), --на десятое убийство клира
function()
kami:SpawnMaintainGroup() --включаем камикадзе
end,
OnEvery(Times(6, Event(kami.OneKilled))), -- на каждое шестое убийство камикадзе
function()
scorp:SpawnOne() --спауним скорпиона
end)

 

Короче говоря, функция On(Аргумент) выполняется только когда Аргумент функции On() возвращает значение "True", или 1.

Аргументы функции On():

Event(m.n) - возвращает 1, если результат доступа к параметру n переменной m возрващает 1. Пример - On(Event(gnaar.OneKilled)); "gnaar" - переменная, "." - оператор прямого доступа, "OneKilled" - параметр переменной.

Delay(N) - возвращает 1 через N секунд.

Any(Event(), Event()) - возвращает 1, когда любой из аргументов "Event()" возвращает 1.

All(Event(), Event()) - возвращает 1, когда все аргументы возвращают 1.

Times(N, Event()) - возвращает 1, когда аргумент Event() вернет значение 1 N раз.

Тогда как функция On() выполняется единожды, функция OnEvery() будет выполняться всякий раз, когда ее аргумент возвращает значение 1.

 Примечание: если вы никак не понимаете, как это так - "возвращает 1" -  читайте "сигнализирует".

Фильтры с групповыми переменными.

Групповые переменные - это переменные, которым присвоены несколько обьектов одного класса. То есть, чтобы получить групповую переменную spawners, выделите желаемые спаунеры и перетащите их на spawners. Им также можно посылать методы:  

 spawners:SpawnSimple() --присвоенным переменной spawners спаунерам  посылается метод SpawnSimple()

и использовать в фильрах:


 On(Events(spawners.AllKlled)) --обратите внимание на функцию Events() вместо  Event()

Заключение

Итак, в этой статье я обьяснил следующее:

Как спаунить персонажей строем, в определенных точках и в определенном порядке.

Как отправить их на марш по маршруту сразу после рождения.

Как создавать навигационную сетку для самостоятельного нахождения пути.

Каким образом можно и нужно либо не стоит и категорически нельзя выводить врагов на карту.

И как писать более продвинутые скрипты для спауна.  


На этом все. Удачи!



Комментарии   

№ 17  |  26.02.2015  |  -1  
Помогите мне пожалуйста делал маркеры когда завершает идет назад помогите дайте мне оюъяснения не умею как настраивать маркеры в тактике
Ответ Цитата

№ 15  |  09.10.2012  |  0  
Спасибо большое за статью, очень помогла Ssmile4
Ответ Цитата

№ 14  |  20.06.2012  |  0  
Не работает ваша навигационная сетка..
Ответ Цитата

№ 9  |  09.01.2012  |  0  
знаю, что немного не по теме, но все же
Ответ Цитата

№ 10  |  11.01.2012  |  0  
попробуй удалить user data(тогда все стандартные настройки будут в едиторе) должно помочь ;)
Ответ Цитата

№ 11  |  11.01.2012  |  0  
эх, если бы...удалил, но не помогло :(
Ответ Цитата

№ 12  |  12.01.2012  |  0  
Потому что дело не в настройках. Быть может, ты выбрал неверный шейдер, или вообще не там задаешь текстуру.
Ответ Цитата

№ 13  |  12.01.2012  |  0  
да нет, именно там, все делаю по инструкциям и ничего <_<
Ответ Цитата

№ 6  |  07.01.2012  |  0  
отличная статья все понятно написано, попробывал сделать все что в статье написано и все получилось, КЛАС, ну кое что из этого я уже знал :D
а можно сделать что бы клиры не рычали а потом прыгали, а просто рычали а прыжка не было?
Ответ Цитата

№ 7  |  09.01.2012  |  0  
Нет. Если в оригинале этого не было - нельзя.
Ответ Цитата

№ 8  |  09.01.2012  |  0  
жаль :(
Ответ Цитата

№ 16  |  23.01.2013  |  0  
Но можно анимацию со звуком-то сделать. :)
Ответ Цитата

№ 5  |  06.01.2012  |  0  
Good Job
Ответ Цитата

№ 4  |  05.01.2012  |  0  
а почему примечание таким маленьким шрифтом? :)
Ответ Цитата

№ 3  |  04.01.2012  |  0  
%)
Ответ Цитата

№ 2  |  04.01.2012  |  0  
%)
Ответ Цитата

№ 1  |  04.01.2012  |  0  
Статья написана для SED3.5, но применима и к SED3, за единственным исключением - обьект CTacticProperties указывается не в параметре Tactic, а в параметре Tactics holder в CSpawnerEntity.
Ну и, очевидно, вступительных анимаций там нету.
Ответ Цитата

Оставьте комментарий

Мини-профиль

Гость

Вы в группе: Гости
Ваш IP: 54.198.143.210

Информация

Прочее

Категории раздела

Croteam [3]
Материалы по студии разработчика игр CroTeam.
Интервью с разработчиками [9]
Интервью с разработчиками, а также их издателями.
Serious Sam 1 [10]
Статьи о Serious Sam 1
Serious Sam 2 [6]
Статьи о Serious Sam 2
Serious Sam HD [5]
Статьи о HD-серии, ремейков классических версий Сэма.
Serious Sam 3: BFE [9]
Статьи о Serious Sam 3: BFE
Уроки по Serious Editor 1 [55]
Уроки по Serious Editor 2 [2]
Самое серьёзное редактирование, на русском!
Уроки по Serious Editor 3 [33]
Уроки по работе с редактором.
Serious Engine [6]
Описание возможностей всех движков компании Croteam
Разное [26]
Всё что не подошло не под одну из вышеупомянутых категорий.
Serious Sam: Revolution [1]
Материалы по SS: Revolution, серьёзном обновлении классических Крутых Сэмов.
Serious Sam 1.05/1.07 SDK [10]
SDK - набор исходников для Serious Sam: The Second Encounter 1.05/1.07.

Голосование

С какой части Serious Sam началось ваше первое знакомство с серией?
1. Serious Sam: The First Encounter (2001)
2. Serious Sam: The Second Encounter (2002)
3. Serious Sam 2 (2005)
4. Serious Sam 3: BFE
5. Serious Sam HD: The First Encounter (2009)
6. Serious Sam HD: The Second Encounter (2010)
7. Serious Sam: Next Encounter (2004)
8. Serious Sam: Xbox (2002)
9. Serious Sam: Kamikaze Attack! (2011)
10. Serious Sam: Advance (2004)
11. Serious Sam: Double D (2011)
12. Serious Sam: The Random Encounter (2011)

Статистика



На сайте: 11
Гостей: 9
Пользователей: 2
Ден, Dismemberment-Mod-Kiling