|
Форум РЕДАКТОР - ArmA 2 Основное Руководство по новой системе диалогов. (Перевод с официального форума) |
Руководство по новой системе диалогов. |
› Среда
› 08.06.2011
› 18:12
› Сообщение #
Как многие из вас заметили, Арма II введена новая система разговора (далее я буду называть это "разговоры") который заменил старые способы типа say или Radio, которые базировались на description.ext. О этой системе было задано много вопросов, и я решил написать короткий обзор о возможностях этой системы.
Основные преимущества: • Разговор всегда проходит через соответствующий канал (лицом к лицу, по радио и т.д.) • Возможность создавать полностью динамические разговоры. • Разветвление FSM позволяет быстро и эффективно редактировать. Теория Для того чтобы запустить разговор, все участники должны иметь соответствующую тему. Разговор начинается с первого предложения которое один из участников говорит другому. После этого разговор обычно контролируется с помощью скриптов - FSM и обработчики событий, назначенные участникам. После получения предложения, скрипт реагирует на его ID и дает нужный ответ. Это может показаться немного сложным, но на самом деле нет. Давайте начнем с добавления темы. Скриптовая команда для этого – kbAddTopic Code person kbAddTopic [topicName, fileName.bikb, (fileName.fsm, (eventHandler))] • topicName: (строка) Что угодно. • fileName.bikb: (строка) Название .bikb файла – объясню потом. • fileName.fsm: (строка) Name of the .fsm file - объясню потом. Опционально. • eventHandler: (строка или код) объясню потом. Опционально. Вот так это обычно выглядит: Code unit2 kbAddTopic ["baseDefended", "baseDefended.bikb", "baseDefended_unit2.fsm", {call compile preprocessFileLineNumbers "baseDefended_unit2.sqf"}] Файл .bikb Означает "Bohemia Interactive Knowledge Base"(База знаний БИСов). Сначала использовалась только для хранения памяти о увиденных ботами объектах. Не важно для вас. Вы будете использовать эти файлы для хранения примеров речи(далее "предложения"), которые используются в теме. На самом деле очень похож на старые добрые классы cfgSounds и cfgRadio в description.ext. Вот короткий .bikb файл: Code class Sentences { class example_01 { text = "Превед Бред."; speech[] = {"\Sound\jemaine01.ogg"}; class Arguments {}; }; class example_02 { text = "О, привет Джемайн."; speech[] = {"\Sound\bret01.ogg"}; class Arguments {}; } }; class Arguments{}; class Special{}; startWithVocal[] = {hour}; startWithConsonant[] = {europe, university} • text: субтитры для подписи. Если используете stringtable, пишите $stringName (в названии строки должно быть "STR_"!) • speech: звук для речи. • arguments, special, startWithVocal, startWithConsonant: Это не ваше дело. Скрипты И в FSM и в обработчиках событий есть стандартные переменные, которые вы будете часто использовать: • _this: тот, кто говорит. Юнит, которому назначен это скрипт через kbAddTopic. • _from: говорит само за себя. Юнит, который сказал предложение. • _sentenceId: Предложение, на которое реагирует юнит. Описывается в .bikb в классе Sentences. • _topic: говорит само за себя. Название темы, которое используется в kbAddTopic. FSM FSM означает Finite-state machine(Конечные состояния машины). Мы выпустили FSM Editor некоторое время назад. Я не буду перечислять все его возможности, я уверен, что существует много руководств для него. Можете открыть один из FSMов, которые используются в миссии примере example mission (вам нужен FSM Editor чтоб открыть его). Как вы видите, FSM параметр опционален в kbAddTopic. Это потому что a) вы вообще не хотите использовать скрипты и хотите управлять диалогом вручную (об этом позже) или b) юнит всегда управляется игроком. Движок распознает, кто управляет юнитом во время разговора. Если он контролируется ИИ, прикрепленный FSM используется. Если он контролируется игроком, используется(?) обработчик событий. Если вы делаете сетевую миссию и юнитом можно играть, вы будете должны использовать оба способа. Обработчики событий Ничего общего со стандартными обработчиками. Это код, который используется только тогда, когда юнитом управляет игрок и активируется не только при разговоре, но и если игрок достаточно близок для начала разговора(появляется действие "Поговорить”). Это очень важно для понимания. FSM исполняется, только после каждого предложения, обработчики событий исполняются постоянно(обычно каждый кадр) так долго, пока вы сфокусированы на ком-то. Вот пример, показывающий, все, что вы хотите использовать (сначала вы должны ознакомиться с kbTell и kbWasSaid): Code // Здесь мы будем хранить все предложения, из которых игрок будет выбирать(меню на левой стороне экрана) // Если имеется только один вариант в массиве, у вас будет предложение, как "Поговорить" действий BIS_convMenu = []; // мы хотим, чтобы игрок смог подойти к его приятель и поговорить с ним через меню действий // нам надо проверить: // смотрю ли я на своего приятеля // отвечаю ли я на его предложения // сказал ли я ему хотя бы привет // потом мы положим массив в BIS_convMenu – параметры, которые в основном говорят сами за себя. if (_from == buddy1 && _sentenceId == "" && !(_this kbWasSaid [_from, _topic, "hello1", 999999])) then { BIS_convMenu = BIS_convMenu + [["Say hello.", _topic, "hello1", []]] }; // Здесь мы заставляем юнита сказать надлежащее предложение на основе того, которое он только что получил // я использую switch-case-do, все зависит от вашего желания switch (_sentenceId) do { case "hello1": { _this kbTell [_from, _topic, "hi_how_are_you"] }; case "good_you": { _this kbTell [_from, _topic, "fine_thanks"] }; case "what_do_we_do_today": { // here the player will have 3 answers to choose from BIS_convMenu = BIS_convMenu + [["Football.", _topic, "choose_footbal", []]]; BIS_convMenu = BIS_convMenu + [["Bike.", _topic, "choose_bike", []]]; BIS_convMenu = BIS_convMenu + [["Arma II.", _topic, "choose_arma2", []]] }; }; // возвращаем предложение в список BIS_convMenu Вот. В комментариях все объяснено, как видите, это просо sqf скрипт. "Прерванные" события Меню со списком возможных предложений может быть закрыто с помощью клавиши backspace в любое время. Если вы хотите, чтобы обратиться к этому событию просто добавьте новый класс в предложения с названием Interrupted в ваш .bikb файл. Его можно будет использовать в качестве стандартного _sentenceId в скрипте. Миссия пример И, наконец, вот оно. Миссия пример содержит все, что было описано здесь и показывает вам, главным образом, как управлять файлами. Она содержит образцы речи из кампании Harvest Red, пожалуйста, не удивляйтесь, что разговор немного вне контекста. Скачать здесь "Ручное" управление разговором По некоторым причинам вы не захотите использовать FSM и обработчики событий для контроля разговора. Вместо этого вы можете использовать команду kbWasSaid. Примера хватит, наверно: Code miles kbAddTopic ["briefing", "kb\briefing.bikb", ""]; shaftoe kbAddTopic ["briefing", "kb\briefing.bikb", ""]; shaftoe kbTell [miles, "briefing", "shaftoe_briefing_H_1"]; waitUntil {shaftoe kbWasSaid [miles, "briefing", "shaftoe_briefing_H_1", 3]}; miles kbTell [shaftoe, "briefing", "shaftoe_briefing_M_1"]; waitUntil {miles kbWasSaid [shaftoe, "briefing", "shaftoe_briefing_M_1", 3]}; hint "Разговор окончен." Миссия завершена. Вроде все. Сообщение отредактировал DICS - Пятница, 10.06.2011, 13:40
|
› Среда
› 08.06.2011
› 18:31
› Сообщение #
я тока комманды от A до B преодолел а тут уже FSM.у пионера примеры до этого через SQF были просто отдельно липки для губ добавлялись.в чем разница то?
Умные люди никогда не обижаются-они просто сразу начинают планировать месть
Я, конечно, презираю отечество мое с головы до ног - но мне досадно, если иностранец разделяет со мной это чувство. -Александр Пушкин- Надо любить свою страну, как бы этому ни мешало государство. -Михаил Мамчич- |
› Пятница
› 10.06.2011
› 14:07
› Сообщение #
|
› Пятница
› 10.06.2011
› 14:22
› Сообщение #
Quote (DICS) В FSM легче делать многовариантность нисколько. В FSM есть графический редактор и только |
› Пятница
› 10.06.2011
› 14:26
› Сообщение #
|
› Пятница
› 10.06.2011
› 15:42
› Сообщение #
DICS, мне бы хоть sqf побольше освоить...
|
› Пятница
› 10.06.2011
› 15:53
› Сообщение #
|
› Среда
› 07.09.2011
› 08:44
› Сообщение #
FMS по моему бред, тот графический интерфейс никому не нужен и сделать всё, что можно в FMS можно в SQF причем без вылетов армы, если что не так сделаешь. Многоразговорность можно и в SQF один запихнуть, можно даже и в SQS постараться.
Quote (DICS) уверен, что существует много руководств для него Не много, а единственное. Quote (rusik) B преодолел а тут уже FSM.у пионера примеры до этого через SQF были просто отдельно липки для губ добавлялись.в чем разница то? Я сделал специально в SQF ибо знаю что FMS точно никто не поймет, SQS не все поняли еще Lip файлы уже не нужны вовсе, если еще в старых ОА они были нужны то в новых патчах БИС всё исправило и теперь забудьте о них, многие и не знали что они есть. rusik, разница в том что, в SQF ты сразу видишь код болтовни, а в FMS графические кубики, вот и всё. Самое большое что мне не нравится в FMS, это то, что если ты в коде допустил ошибку - вылет игры, зачем он такой нужен! |
› Среда
› 07.09.2011
› 09:28
› Сообщение #
Quote (PIONEER) Не много, а единственное. Это перевод с офф. форума. Все претензии к разработчику игры, который писал эту статью. PIONEER, FSM не так уж и плох. Конечно, если тебе надо, чтобы персонажи болтали сами по себе, нужно использовать sqf. Но вот когда нужно сделать диалог, в котором варианты ответа выбирает игрок, тогда лучше использовать FSM. Помню, как мучился, создавая такой диалог в sqf. Приходилось писать несуразные скрипты с waitUntil {player distance ... < 2} и т.д. А вот с FSM вышло намного легче, надо только написать обработчик для бота и игрока. Кстати, не знаю, почему ты ругаешься на ошибки в коде, ведь при сохранении кода с ошибкой FSM Editor пишет, что код не компилируется. |
› Среда
› 07.09.2011
› 18:45
› Сообщение #
Поддерживаю DICS
PIONEER, все притензиции к BIKI, а точнее к ее создателям. |
› Среда
› 07.09.2011
› 19:49
› Сообщение #
Quote (DICS) А вот с FSM вышло намного легче неможет в FSM выйти легче потому как исполняемый код пишется в формате SQF и писать придётся теже самые условия Удобство FSM-редактора в графике и проверке скрипта на ошибки. Востальном он ничуть не лучше остальных форматов. приведу примеры анологов FSM - 4 блока по 3 условия притом что различий в условиях всего 5 SQS Code #Bloc1 предварительные действия #cikl1 ? условие1 : действие; goto "cikl2" ? условие2 : действие; goto "cikl3" ? условие3 : действие; goto "cikl4" ~0.1 goto "Bloc1" #Bloc2 предварительные действия #cikl1 ? условие4 : действие; goto "cikl1" ? условие2 : действие; goto "cikl3" ? условие3 : действие; goto "cikl4" ~0.1 goto "Bloc2" #Bloc3 предварительные действия #cikl1 ? условие4 : действие; goto "cikl1" ? условие1 : действие; goto "cikl2" ? условие3 : действие; goto "cikl4" ~0.1 goto "Bloc3" #Bloc4 предварительные действия #cikl1 ? условие4 : действие; goto "cikl1" ? условие1 : действие; goto "cikl2" ? условие2 : действие; goto "cikl3" ? условие5 : действие; exit ~0.1 goto "Bloc4" SQF Code _con = [1,2,3]; While {условие5 выхода из скрипта} do { { Switch _x do { case 1:{ условие1; _con = [2,3,4]; }; case 2:{ условие2; _con = [1,3,4]; }; case 3:{ условие3; _con = [1,2,4]; }; case 4:{ условие4; _con = [1,2,3]; }; }; } forEach _con; sleep 0.1; }; |
› Суббота
› 07.01.2012
› 21:39
› Сообщение #
|
› Воскресенье
› 08.01.2012
› 08:44
› Сообщение #
Скопируй эту ссылку в адресную строку
http://armaholic.com/wolle/Jezuro_ConvsExample.zip Сообщение отредактировал DICS - Воскресенье, 08.01.2012, 08:45
|
› Среда
› 09.03.2016
› 13:58
› Сообщение #
Знатоки бис-диалогов, есть проблема.
Раньше все диалоги я делал между игроком и юнитом, "глаза в глаза". Теперь нужен диалог с удаленным от игрока ботом. Конкретнее - в ролике - сначала диалог между двумя юнитами, здесь все нормально, затем камера перелетает на другой конец острова - и здесь реплика не пропечатывается. На странице kbtell есть пример диалога с HQ-логикой, но у меня не получилось. Диалог у меня в самом простом виде: файл бикб со структурой class Sentences { class SDAYS_301 { text =............................................ и реплики в виде player kbTell [bv, "briefing", "SDAYS_301"]; |
| |||
| |||
Чат сайта |