Управление Наземными 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 |