Пример простой викторины

Начинающий
Статус
Оффлайн
Регистрация
13 Дек 2020
Сообщения
13
Реакции[?]
9
Поинты[?]
0
Урок от начинающего изучение UE4 для таких же начинающих.
Предыстория: здесь человек попросил помощи и описал что ему надо. Мне задача показалась интересной и вполне простой чтобы попробовать свои силы. Результат перед вами.

Задача:
На базе шаблона игры от третьего лица написать опросник/викторину. Персонаж подходит в определённую точку (пусть это будет стол с экзаменатором) и в этот момент начинается тестирование:
  • персонаж стоит и не двигается
  • отображается виджет с вопросом и вариантами ответов
  • мышкой выбираем вариант ответа (или кнопку завершить)
  • отображаем на экране результат ответа (верно/не верно), виджет закрывается
  • если НЕ «завершить» - подсчитываем общее количество правильных ответов и задаем следующий вопрос (отображается следующий виджет)
  • если «завершить», то закрываем текущий виджет и выводим результаты тестирования (сколько ответил верно из общего количества вопросов)
Использую UE 4.26.0
  1. Создаем новый уровень Default, я назвал его QuizLevel:

добавляем на него тригер и текстовую надпись. Когда наш персонаж подойдет к ней - начнется викторина

2. Создаем наш виджет с вопросом. Я выбрал самый просто вариант: вопрос и 3 кнопки для ответа (в моем примере правильный может быть только один). Дополнительно выводится номер вопроса и кнопка «Завершить»

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

Я назвал свой виджет WBP_Quiz, мне нужны только 4 кнопки (их я переименовал) и один текст для отображения порядкового номера вопроса - тоже переименовал и установил для него признак того, что эта переменная


Переходим в граф нашего виджета, видим наши кнопки и tvNum в списке переменных. Добавляем еще 3 переменные:
  • Num (integer) – порядковый номер вопроса, просто для информирования пользователя о прогрессе
  • ValidNum (integer) – индекс правильного ответа от 0 до 2 (по кол-ву кнопок)
  • Guested (Boolean) – признак того, что пользователь ответил правильно

В Event Dispatcher добавляем 2 события:
  • NextQuestion – будем отправлять из виджета после ответа, если хотим следующий вопрос. Обратите внимание, что для этого события добавлен один булевый параметр – признак того, что пользователь ответил правильно. Пригодится для подсчета результатов.
  • EndQuestions – отправляем когда хотим завершить тестирование


После создания виджета выведем порядковый номер в текстовое поле и случайным образом установим значение для правильного варианта ответа (это только для этого примера):

Обработчики нажатия на 3 кнопки все одинаковые, только в первом случае ValidNum проверяется на равенство с 0, для второй кнопки с 1 и т.д:

Для кнопки “Завершить” все еще проще, вызаваем сразу событие:

Виджет готов, переходим в блюпринт уровня.

3. В блюпринте уровня у нас будет вся логика связанная с отображением/скрытием виджетов, подсчетов и выводом результатов. Добавляем переменные:
  • Widget (WBP_Quiz Object Reference) – ссылка на создаваемый виджет. У меня всего один тип виджета, поэтому и ссылка одна
  • Num (integer) – порядковый номер вопроса, будем просто прибавлять 1 при каждом следующем вопросе
  • ValidNums(integer) – количество правильных ответов
  • QuizStarted(boolean) – признак того, что викторина запущена, просто для страховки чтобы не запускать второй раз если будет сработка триггера

Также добавляем событие тригера onActionBeginOverlap, сработает когда персонаж зайдет в него и еще несколько кастомных евентов:
  • onShowQuestion – показываем виджет с вопросом
  • onHideQuestion – скрываем ранее открытый виджет
  • onEndQuiz – вывод результатов тестирования
  • onNextQuestion – подсчёт правильных ответов и отображение следующего вопроса. Обратите внимание, что для этого события добавлен булеан входящий параметр. В него передается значение из соответствующего события (NextQuestion) виджета
Кодируем. Все начинается при срабатывании тригера. Если викторина не запущена, очищаем счетчик вопросов и правильных ответов, запускаем:


OnShowQuestion: выводим сообщение отладки, увеличиваем счетчик, создаем виджет (если ранее не создали и сохраняем на него ссылку), отображем виджет:

Далее биндимся к нашим 2-ум событиям виджета (просто перетащите их из виджета), включаем оторажение мыши и останавливаем персонажа:


onHideQuestion: если виджет был ранее создан - убираем его с экрана, скрываем мышь и восстанавливаем “подвижность” персонажа + дебажное сообщение


OnNextQuestion: Простой подсчет результатов: если получили от виджета true - увеличиваем счетчик правильных ответов, потом скрываем предыдущий виджет, немного ждем и открываем следующих вопрос (в мое примере это тот же виджет, у вас может быть другой)

onEndQuiz: Скрываем виджет с экрана и выводим результаты тестирования. В моем примере это просто сообщение в отладчике – у вас может быть виджет или что-то другое. Можно мелодию воспроизвести или салют запустить). И в конце очищается флаг «запущенности» викторины.

Обратите внимание на красные жгуты - это биндинг с событиями виджета.

На этом все, запускаем и проверяем. У меня
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
 
Сверху Снизу