-
Автор темы
- #1
Урок от начинающего изучение UE4 для таких же начинающих.
Предыстория: здесь человек попросил помощи и описал что ему надо. Мне задача показалась интересной и вполне простой чтобы попробовать свои силы. Результат перед вами.
Задача:
На базе шаблона игры от третьего лица написать опросник/викторину. Персонаж подходит в определённую точку (пусть это будет стол с экзаменатором) и в этот момент начинается тестирование:
добавляем на него тригер и текстовую надпись. Когда наш персонаж подойдет к ней - начнется викторина
2. Создаем наш виджет с вопросом. Я выбрал самый просто вариант: вопрос и 3 кнопки для ответа (в моем примере правильный может быть только один). Дополнительно выводится номер вопроса и кнопка «Завершить»
В этом примере есть только один виджет и вопрос тоже один)). Конечно, у вас может быть много разных виджетов с разным количеством вариантов ответов. Или можно легко расширить этот (передавать в него вопрос и правильный индекс ответа).
Я назвал свой виджет WBP_Quiz, мне нужны только 4 кнопки (их я переименовал) и один текст для отображения порядкового номера вопроса - тоже переименовал и установил для него признак того, что эта переменная
Переходим в граф нашего виджета, видим наши кнопки и tvNum в списке переменных. Добавляем еще 3 переменные:
В Event Dispatcher добавляем 2 события:
После создания виджета выведем порядковый номер в текстовое поле и случайным образом установим значение для правильного варианта ответа (это только для этого примера):
Обработчики нажатия на 3 кнопки все одинаковые, только в первом случае ValidNum проверяется на равенство с 0, для второй кнопки с 1 и т.д:
Для кнопки “Завершить” все еще проще, вызаваем сразу событие:
Виджет готов, переходим в блюпринт уровня.
3. В блюпринте уровня у нас будет вся логика связанная с отображением/скрытием виджетов, подсчетов и выводом результатов. Добавляем переменные:
Также добавляем событие тригера onActionBeginOverlap, сработает когда персонаж зайдет в него и еще несколько кастомных евентов:
OnShowQuestion: выводим сообщение отладки, увеличиваем счетчик, создаем виджет (если ранее не создали и сохраняем на него ссылку), отображем виджет:
Далее биндимся к нашим 2-ум событиям виджета (просто перетащите их из виджета), включаем оторажение мыши и останавливаем персонажа:
onHideQuestion: если виджет был ранее создан - убираем его с экрана, скрываем мышь и восстанавливаем “подвижность” персонажа + дебажное сообщение
OnNextQuestion: Простой подсчет результатов: если получили от виджета true - увеличиваем счетчик правильных ответов, потом скрываем предыдущий виджет, немного ждем и открываем следующих вопрос (в мое примере это тот же виджет, у вас может быть другой)
onEndQuiz: Скрываем виджет с экрана и выводим результаты тестирования. В моем примере это просто сообщение в отладчике – у вас может быть виджет или что-то другое. Можно мелодию воспроизвести или салют запустить). И в конце очищается флаг «запущенности» викторины.
Обратите внимание на красные жгуты - это биндинг с событиями виджета.
На этом все, запускаем и проверяем. У меня
Предыстория: здесь человек попросил помощи и описал что ему надо. Мне задача показалась интересной и вполне простой чтобы попробовать свои силы. Результат перед вами.
Задача:
На базе шаблона игры от третьего лица написать опросник/викторину. Персонаж подходит в определённую точку (пусть это будет стол с экзаменатором) и в этот момент начинается тестирование:
- персонаж стоит и не двигается
- отображается виджет с вопросом и вариантами ответов
- мышкой выбираем вариант ответа (или кнопку завершить)
- отображаем на экране результат ответа (верно/не верно), виджет закрывается
- если НЕ «завершить» - подсчитываем общее количество правильных ответов и задаем следующий вопрос (отображается следующий виджет)
- если «завершить», то закрываем текущий виджет и выводим результаты тестирования (сколько ответил верно из общего количества вопросов)
- Создаем новый уровень Default, я назвал его QuizLevel:
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FfRq0BqYy%2F001.png&hash=81ba4a006c2b127520e1fede318d9b67)
добавляем на него тригер и текстовую надпись. Когда наш персонаж подойдет к ней - начнется викторина
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FZKTBZzc0%2F002.png&hash=1106b1a4d869fdccaaae0b874cac6a2d)
2. Создаем наш виджет с вопросом. Я выбрал самый просто вариант: вопрос и 3 кнопки для ответа (в моем примере правильный может быть только один). Дополнительно выводится номер вопроса и кнопка «Завершить»
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FPJHLPgn3%2F003.png&hash=eafbd43313b2664fbe99d595f17153a8)
В этом примере есть только один виджет и вопрос тоже один)). Конечно, у вас может быть много разных виджетов с разным количеством вариантов ответов. Или можно легко расширить этот (передавать в него вопрос и правильный индекс ответа).
Я назвал свой виджет WBP_Quiz, мне нужны только 4 кнопки (их я переименовал) и один текст для отображения порядкового номера вопроса - тоже переименовал и установил для него признак того, что эта переменная
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2Ftg1nfdz5%2F004.png&hash=c7350e64a930b22b9f1428949d6703e7)
Переходим в граф нашего виджета, видим наши кнопки и tvNum в списке переменных. Добавляем еще 3 переменные:
- Num (integer) – порядковый номер вопроса, просто для информирования пользователя о прогрессе
- ValidNum (integer) – индекс правильного ответа от 0 до 2 (по кол-ву кнопок)
- Guested (Boolean) – признак того, что пользователь ответил правильно
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FcJVtNK9N%2F005.png&hash=34d53e8611640cee25e594f125317e28)
В Event Dispatcher добавляем 2 события:
- NextQuestion – будем отправлять из виджета после ответа, если хотим следующий вопрос. Обратите внимание, что для этого события добавлен один булевый параметр – признак того, что пользователь ответил правильно. Пригодится для подсчета результатов.
- EndQuestions – отправляем когда хотим завершить тестирование
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FkGy28Tnn%2F006.png&hash=2e5e82348b3f3b9554057491537b4dad)
После создания виджета выведем порядковый номер в текстовое поле и случайным образом установим значение для правильного варианта ответа (это только для этого примера):
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2F44v7rxpr%2F007.png&hash=c5382a765465307a9d23bd5f769fb319)
Обработчики нажатия на 3 кнопки все одинаковые, только в первом случае ValidNum проверяется на равенство с 0, для второй кнопки с 1 и т.д:
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2F52r6wYMF%2F008.png&hash=1055114dbfbc3e9fb8f65fd156d27e98)
Для кнопки “Завершить” все еще проще, вызаваем сразу событие:
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FY9YG2pZL%2F009.png&hash=b808e696d125e288da31407e3150415f)
Виджет готов, переходим в блюпринт уровня.
3. В блюпринте уровня у нас будет вся логика связанная с отображением/скрытием виджетов, подсчетов и выводом результатов. Добавляем переменные:
- Widget (WBP_Quiz Object Reference) – ссылка на создаваемый виджет. У меня всего один тип виджета, поэтому и ссылка одна
- Num (integer) – порядковый номер вопроса, будем просто прибавлять 1 при каждом следующем вопросе
- ValidNums(integer) – количество правильных ответов
- QuizStarted(boolean) – признак того, что викторина запущена, просто для страховки чтобы не запускать второй раз если будет сработка триггера
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2F282qS9cG%2F010.png&hash=e1ad24ba083d375d1e70bc532627809a)
Также добавляем событие тригера onActionBeginOverlap, сработает когда персонаж зайдет в него и еще несколько кастомных евентов:
- onShowQuestion – показываем виджет с вопросом
- onHideQuestion – скрываем ранее открытый виджет
- onEndQuiz – вывод результатов тестирования
- onNextQuestion – подсчёт правильных ответов и отображение следующего вопроса. Обратите внимание, что для этого события добавлен булеан входящий параметр. В него передается значение из соответствующего события (NextQuestion) виджета
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FwjM1y5np%2F011.png&hash=2195b7f400e79079b3a1b55c478651e2)
OnShowQuestion: выводим сообщение отладки, увеличиваем счетчик, создаем виджет (если ранее не создали и сохраняем на него ссылку), отображем виджет:
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FY960KdL1%2F012.png&hash=5496aa1aff49ca85d866063123e93a2f)
Далее биндимся к нашим 2-ум событиям виджета (просто перетащите их из виджета), включаем оторажение мыши и останавливаем персонажа:
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FvBFTNJTY%2F013.png&hash=06444983b74342dca50553152f862207)
onHideQuestion: если виджет был ранее создан - убираем его с экрана, скрываем мышь и восстанавливаем “подвижность” персонажа + дебажное сообщение
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FPq8NKXtV%2F014.png&hash=1676b8820faaf048a138c81beb057432)
OnNextQuestion: Простой подсчет результатов: если получили от виджета true - увеличиваем счетчик правильных ответов, потом скрываем предыдущий виджет, немного ждем и открываем следующих вопрос (в мое примере это тот же виджет, у вас может быть другой)
onEndQuiz: Скрываем виджет с экрана и выводим результаты тестирования. В моем примере это просто сообщение в отладчике – у вас может быть виджет или что-то другое. Можно мелодию воспроизвести или салют запустить). И в конце очищается флаг «запущенности» викторины.
Обратите внимание на красные жгуты - это биндинг с событиями виджета.
![](/proxy.php?image=https%3A%2F%2Fi.postimg.cc%2FWzs3200x%2F015.png&hash=e26445f174ed2a1c7fcabc866c03554c)
На этом все, запускаем и проверяем. У меня
Пожалуйста, авторизуйтесь для просмотра ссылки.
.