Перейти к содержанию
  • записей
    46
  • комментария
    23
  • просмотра
    3 292

Разбор работы системы диалогов в играх

Авторизация  
partoftheworlD

56 просмотров

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

Во вторник я освобожусь и уже займусь написанием основной статьи.

 

Существует всего несколько типов привязки диалогов для показа игроку:

  1. К какой-либо ситуации(триггеру)
  2. К нажатию клавиш
  3. К среднему времени чтения диалога.
  4. К озвучке

 

Чаще всего используется 4 вариант, но есть извращенцы, которые любят смешивать 1-2, 1-3.

 

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

 

Вторая привязка это привязка к нажатию клавиш, т.е подойдя к нпц диалог не будет запущен, пока не будет нажата клавиша.

 

Третья привязка по времени, обычно в таком варианте используется константа для показа диалогов, значение константы рассчитывается командой специалистов по *заумное название исследований поведения и информации тестировщиков*

 

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

 

В играх на UE, Unity диалоги делаются с помощью чертежей, либо написанием кода.

image.png.ecd100e9ea44d9f2f4fc87d2b6f1d192.png

 

В других играх через скрипты.

 

Но что объединяет эти способы?

  1. Инициализация пользовательского интерфеса.
  2. Парсинг игровых файлов, для загрузки диалогов в память.

 

Отлично, теперь мы знаем, что нам необходимо искать, либо находить функцию рисования субтитров, через поиск текста в памяти, либо будем искать обработчик/проверку, которая будет проверять запущена ли озвучка, и когда она заканчивается. Скорее всего, используется QueryPerformanceCounter для вычисления момента когда остановится озвучка и выглядит как-то так.

  rax, rbx, rcx = 0
  rax = QueryPerformanceCounter()
  rbx = GetDialogTime("dialog_+" i "+.wav")
  rcx = rbx + rax
  while(bDialogEnabled):
    if rax > rcx:
      clear_text();
      Dialogs[i]++;
    else:
      draw_text(Dialogs[i])

Вдруг это предисловие сможет указать верный путь для тех, кто не хочет ждать когда за него все сделают. Если такие найдутся, то пишите о результатах в комментариях к этой теме(пока что, позже все комментарии будут перенесены в основную статью)

  • Понравилось 2
  • Плюс 1
Авторизация  


0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.