Управление наземными NPC - Маппинг - Каталог статей - Официальный сайт Hell494
Приветствую Вас 1-класс | RSS Главная | Каталог статей | Регистрация | Вход
Меню сайта

Категории раздела
Программирование [7]
Моделирование [8]
Маппинг [67]
Текстурирование [10]

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Мини чат
200

Главная » Статьи » Маппинг

Управление наземными NPC
Управление наземными NPC
Управление Наземными NPC.На этом уроке Вы получите начальные знания в управлении Наземными NPC:Думаю вы уже без труда можете сделать себе помещение или комнату, так что не буду описывать как это делается.
Я к Уроку приложил карту со всеми NPC,триггерами и тп. это я специально для тех кому лень всё делать самому. (остаётся только поглазеть настройки и узнать для чего они нужны =) ).
И так...
На этом уроке я вас познакомлю с системой тригеров для NPC и после его прохождения в сможете:
- Комната 1: Назначать NPC их путь передвижения с помощью scripted_sequence
- Комната 2: Назначать NPC их путь передвижения с помощью path_corner
- Комната 3: Анимировать NPC
- Комната 4: Respawn NPC и после этого сразу указывать куда идти
- Комната 5: Respawn случайного монстра или генератов случайных чисел.
- Комната 6: Заставлять NPC Стрелять куда угодно/атаковать кого угодно/указывать кто ему враг а кто нет/
Как вы уже наверно заметили карта разделена на маленькие комнаты. Я сделал это специально, чтобы отделить наши подтемы урока.
В каждой комнате я поставил рычаг (где то кнопки поставил, где то бьющийся предмет ) для запуска триггера .
PS: не обращайте внимание на фиолетовые кубики у меня на скринах. Это light_spot.

Первая комната:
Здесь Самый простой скрипт, для "отправки" NPC в одну точку с помощью scripted_sequence.
Для этого нам понадобится следующее:
1) npc_alyx // естесственно сам NPC
Настройки:
Name: Alyx_room1 // задаём имя, чтобы можно было обратиться к этой энтити от других.
2) scripted_sequence // Имеено до этой энтити будет идти Алекс
Настройки:
Name: Alyx_target_room1
Target NPC: Alyx_room1 // здесь указываем с каким NPC будет работать наш scripted_sequence
Custom Move Animation: s_walk_N // Это поле позволяет нам самим выбрать какую анимацию будет выполнять NPC при передвижении. Я выбрал простую ходьбу.
Move To Posotion: Walk // Как будет добираться NPC до цели. Я выбрал пешком.
4) func_button
В исходящих триггерах (закладка "Outputs") добавляем следующее:
My output Named: On Pressed
Tagets Entities Named: alyx_target_room1
Via This Input: Start Sequence
Давайте теперь поставим Alyx в один конец комнаты, а Alex_target в другой.
У вас должно получиться примерно следующее

Теперь можете компилировать и смотреть что получилось.
А получиться должно следующее:
При нажатии на кнопку, Алекс должна дойти до конца комнаты.

Вторая комната:
В этом примере рассмотрим передвижение NPC по заданному маршруту.
Этот пример похож на предыдущий, но только тут мы теперь будем вместо scripted_sequence использовать path_corner.
Path_Corner тоже является пунктом передвижения NPC и его обычно используют для несложных передвижений в отличии scripted_sequence. Как использовать path_corner вы увидите на этом примере.
Нам понадобятся следующие обьекты:
1) 4 штуки path_corner // Пути.
Настройки:
Name: alyx_path1_room2; alyx_path2_room2;alyx_path3_room2;alyx_path4_room2 // каждому пути даём имя
Next Stop Target: alyx_path2,3,4,1_room2 // здесь указываем имя следующего пути куда будет идти npc . Тоесть если у нас имя alyx_path2_room2, то Next Stop Target будет alyx_path3_room2. Чтобы NPC зациклился в путях, надо в последнем пути, в Next Stop Target указать первый путь. В нашем случае Алекс будет бегать по кругу.

Настройки не нужны
2) aiscripted_shedule // управляет NPC
Настройки:
Name: Alyx_shedule_room2
Target NPC: Alyx_room2 // указываем какой NPC будем управлять
Shedule To Run: Run Goal Path // Что будет делать NPC при запуске. (в нашем случае бежать к цели)
Goal entity: alyx_path1_room2 // Изходя из верхней настройки, указываем куда будет бежать NPC
3) func_button
В исходящих триггерах (закладка "Outputs") добавляем следующее:
My output Named: On Pressed
Tagets Entities Named: alyx_shedule_room2
Via This Input: StartShedule
4) npc_alyx // наша Алекс
Настройки:
Name: Alyx_room2
Вам теперь оссталось расставить всё это дело по местам.
У меня получилось так

Теперь компилируйте и проверяйте. По идеи Алекс должна кругами бегать :)

Третья комната:
В этой комнате вы увидите пример того, как анимируется NPC.
И так, вот набор необходимых энтитей:
1) npc_alyx
Настройки:
Name: alyx_room3
2) scripted_sequence
Настройки:
Name: alyx_start-run_room3
Target NPC: alyx_room3
Action Animation: Open_door_away // Здесь задаётся наименование анимации, которая будет проиграна когда NPC дойдёт до этой энтити.
Custom Move Animation: run2
Move To Position: Run

Закладка OUTPUTS:
My output Named: OnBeginSequence // когда алекс добежит до энтити, случися сследующее...
Tagets Entities Named: door_room3 // ...дверь...
Via This Input: Open // ...откроется...
After a delay in seconds of: 2.30 // ...через 2.30 секунды (почему 2.30 ? 2.30 - это продолжительность анимации Алекс, когда она открывает дверь. Если бы небыло 2.30, то получилось бы, что когда Алекс прибежит к двери, то дверь сама откроется и потом только сработает анимация.)
3) func_door // Дверь уже стоит в комнате, её не надо делать.
Настройки:
Name: door_room3
Delay before Close: -1
В Закладке FLAGS, поставьте галочку на reverse dir ( чтобы дверь открывалась в противоположную сторону).
4) func_button
Закладка OUTPUTS:
My output Named: On Pressed
Tagets Entities Named: alyx_start-run_room3
Via This Input: BeginSequence
У меня расклад такой

Если у вас всё получилось правильно, то при нажатии на кнопку Алекс должна подбежать к двери и открыть её.

Четвёртая комната
Этот урок поможет вам создавать ( респаунить ) NPC и после этого сразу же делать какие то действия.

Эх.. надоела мне эта Алекс ;) и кнопка тоже.... давайте ка поставим......нуу..... Зомби! и разбивающуюся металлическую плитку в качестве рычага например...
Вот список юзаемых энтитей
1) npc_maker // эта энтити отвечает за создание NPC. В нашем случае создаст Зомбика.
Настройки:
Name: zombie_maker_room4
Class name of spawned NPC: npc_zombie
Children's name: zombie_room4
2) aiscripted_schedule // как уже выше упомяналось, эта энтити работает с NPC.
Настройки: // описания настроек aiscripted_schedule я описывал для второй комнаты
Name: zombie_shedule_room4
Target NPC: zombie_room4
Shedule To Run: Run Goal Path
Goal Entity: zombie_path1_room4
3) два path_corner'a
Настройки:
- Для первого:
Name: zombie_path1_room4
Next Stop Target: zombie_path2_room4
- Для второго:
Name: zombie_path2_room4
Next Stop Target: zombie_path1_room4
4) func_breakable // наш рычаг всего триггера в виде стальной пластинки.
Настройки:
Strenght: 1
Material Type: Metal
-- OUTPUTS: // здесь у нас будет несколько триггеров
1) -My output Named: OnBreak // Когда разобьётся....
-Tagets Entities Named: zombie_maker_room4 //...энтити отвечающая за создание зомби...
-Via This Input: Spawn //...создаст зомби
2) - My output Named: OnBreak // Когда разобьётся....
-Tagets Entities Named: zombie_room4 //..зомби...
-Via This Input: SetRelationship //..будет дружелюбным по отношению к...
-With a parameter override of: !player D_LI 9999 //... игроку
-After a delay in seconds of: 0.20 //.. через 0.20 сек
3) -My output Named: OnBreak // Когда разобьётся....
-Tagets Entities Named: zombie_shedule_room4 //..."контролёр над NPC"...
-Via This Input: StartSchedule // ...запустит заданный ему скрипт.... ( В нашем случает укажет куда зомби идти )...
-After a delay in seconds of: 0.40 //...через 0.40 сек.
А теперь расставим всё на места.
Я расставил так:

Что же у нас должно получится ?
При разбивании пластинки наш зомбик после респауна должен бегать му двумя путями и не должен нас укусить =))
PS: стёбные звуки он издаёт когда ходит :))

Пятая комната
Самая главная Энтити в этой комнате это logic_case. Мы посмотрим одну из её возможностей, это выбор случайного значения.
С этой энтитей я вам покажу как можно респаунить случайного монстра.
Нам понадобятся:
1) 5 штук npc_maker
Настройки:
Class name of Spawned NPC: // здесь выбираете 5 разных npc
Каждому NPC присвойте своё имя ( children's name ), чтобы к нему можно было обратиться. Например к npc_alex я присвоил имя alex_maker_room5, для npc_zombie - zombie_maker_room5 и т.д.

2) logic_case
Настройки:
name: npc_case
Case 01: 1
Case 02: 2
Case 03: 3
Case 04: 4
Case 05: 5 // это мы как бы задали 5 чисел, из которых только одно будет выбрано наугад
Закладка Outputs: // здесь нам надо добавить 5 триггеров
1) -My output Named: OnCase01
-Tagets Entities Named: alyx_maker_room5
-Via This Input: Spawn
2) -My output Named: OnCase02
-Tagets Entities Named: zombie_maker_room5
-Via This Input: Spawn
Итак далее пока не выставите триггеры для всех NPC.

А теперь объясняю как это работает:
После того как мы указали, что будут задействованы 5 триггеров, logic_case генерирует их и выбирает только один, который потом запустится.
Соответственно у нас он ( logic_case ) сам выберет какой из npc_maker'ов создаст своего юнита.
Ну и конечно не забудьте запустить наш logic_case, через разбивающуюся плитку.
Тоесть в свойствах у func_breakable в закладке Outputs указываем следующее:
OnBreak -> npc_case -> PickRandom
Вот как я всё это расставил у себя на карте:

Шестая комната
Здесь я покажу вам как заставить NPC стрелять куда вы укажите.

Помните мувик с Е3, где вы забегаете в дом, запирая за собой дверь столом. ? Незаметили когда начинает стрелять Combine в окно ? Я вам скажу: он начинает стрелять когда вы еще не успели сесть за Стиральную машинку(или чтото типо наподобее её =) ).
Ну так вот дорогие мои, это чистой воды скрипт(а Вальв говорила что не будет их...делайте выводы...) и я вам покажу как его реализовать...
Вообщем нам понадобится один или несколько npc_combine_s (можно любого монстра, я выбрал Солдатов). //из настроек нам только надо Обозвать его в поле Name:( у меня Combine_room6 )
Далее понадобится цель, тобишь куда будет стрелять сам NPC. Для этого нам поможет Энтити npc_bullseye со следующими настройками:
Name: // у меня target1_room6
- В закладке Flags ставим галочки на Not Solid и Take No Damage
Теперь нам понадобятся Активаторы, тоесть кнопки или триггеры, которые "Скажут" NPC, что его враг №1 -это наша npc_bullseye.
Я поставил кнопку со следующими настройками:
Закладка Outputs:
1) -My output Named: OnIn //при включении кнопки...
-Tagets Entities Named: combine_room6
-Via This Input: SetRelationShip
- With a parameter ovverride of: target_room6 D_HT 9999 // здесь мы указываем, что target_room6 Враг
2) -My output Named: OnOut //при выключении ктопки
-Tagets Entities Named: combine_room6
-Via This Input: SetRelationShip
- With a parameter ovverride of: target_room6 D_LI 9999 // здесь мы указываем, что target_room6 Свой/союзник
Вот и всё. При нажатии на кнопку, ваш npc будет стрелять в цель, если ктопку отжать То он перестаёт в неё стрелять.
Если ваш NPC по умолчанию вам враг то советую поставить Энтити logic_auto и в Outputs указать следующее:
-My output Named: OnMapSpawn
-Tagets Entities Named: combine_room6
-Via This Input: SetRelationShip
- With a parameter ovverride of: !player D_LI 9999
Так же можно NPC заставить атаковать движущуюся цель. Для этого у энтити npc_bullseye в Поле parent надо укозать имя объекта который передвигается, следовательно npc_bullseye будеть ездить/летать/плавать вместе с его Родителем (parent)
Вот моя расстановка в комнате:

На этом мы закончим наше небольшое обучение в Упрвлении NPC.

Источник: http://www.source-inside.ru/index.php?id=89
Категория: Маппинг | Добавил: HellMapper (02.10.2009) | Автор: 5p1r17
Просмотров: 217 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа

Группа Steam

Наша кнопка

Поиск

Друзья сайта


  • Официальный блог


  • YIIbIpu-TEAM


  • DETLER-TEAM



  • Copyright WEDGe © 2016