Escape Menu
Mar. 17th, 2023 07:56 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Несколько месяцев назад я смотрел на блюпринты в UE с полным непониманием и ужасом. Однако, через некоторое время чуть-чуть освоился и сейчас уже чувствую себя с ними вполне комфортно.
Периодически натыкаюсь на разные задачи, которые решаю с интересоми скрипом мозгов. Например, сабж. Игровое меню, вызываемое кнопкой Escape уже давно стало индустриальным стандартом. И сделать его тут довольно просто. Таким же стандартом стал и возврат в игру по второму нажатию Esc. И вот это внезапно оказалось сделать не так просто.
Камень преткновения - после вызова меню неплохо бы отбирать управление у игрока. Чтобы сослепу не забрёл куда не надо, например. Однако реакция на кнопки клавиатуры идёт через тоже самое игровое управление, и поэтому так Esc в меню уже не будет работать.
Поискал и нашёл минимум три решения.
1) Не отключать управление. Создавать типа второго игрока, которого нигде нет, и передавать управление всего кроме Esc ему пока меню открыто. С этим я разбираться не стал, ибо выглядит как какой-то костыль.
2) Не отключать управление. В блюпринтах интерфейсов есть специальная нода "Listen for input action", если ей включить опцию "consume", то она монополизирует управление пока меню на экране. Вроде бы это именно то, что доктор прописал? Но есть пара нюансов:
а) Она работает только для actions, то есть нажатия кнопок. А для axises (мышь, стики) вроде бы не работает.
б) Одна нода работает только для одного action.
То есть, нужно создавать их для каждого действия отдельно. Это хороший вариант, если нужно сделать, например, чтобы кнопки в меню оставались рабочими, но работали как-то иначе чем в игре. А если нужна только одна Esc, то для всего остального нужно будет делать затычки. И если потом позже нужно будет добавлять новые действия, то для каждого придётся тоже делать затычку.
3) Отключать управление как обычно. Найти в блюпринте интерфейса штатную функцию OnKeyDown и сделать ей Override, куда добавить обработку Escape. Самый короткий и простой вариант, если нужна только одна кнопка. Я остановился на нём.
Нюанс: здесь нельзя принимать стандартные actions, кнопка здесь будет захардкожена. Если потом нужно будет поменять кнопку или добавить, то придётся проходить по всем меню и вручную править.
Менять Escape на другую кнопку для выхода из меню, конечно, никому в здравом уме в голову не придёт, а вот добавлять (например, кнопку на геймпаде) уже может быть нужно.
В любом случае, несколько недоумеваю: это супер-стандартный сценарий использования, нужно такое может быть буквально для каждой первой игры. Почему создатели не предусмотрели для этого какое-то каноничное решение для меня некоторая загадка.
Периодически натыкаюсь на разные задачи, которые решаю с интересом
Камень преткновения - после вызова меню неплохо бы отбирать управление у игрока. Чтобы сослепу не забрёл куда не надо, например. Однако реакция на кнопки клавиатуры идёт через тоже самое игровое управление, и поэтому так Esc в меню уже не будет работать.
Поискал и нашёл минимум три решения.
1) Не отключать управление. Создавать типа второго игрока, которого нигде нет, и передавать управление всего кроме Esc ему пока меню открыто. С этим я разбираться не стал, ибо выглядит как какой-то костыль.
2) Не отключать управление. В блюпринтах интерфейсов есть специальная нода "Listen for input action", если ей включить опцию "consume", то она монополизирует управление пока меню на экране. Вроде бы это именно то, что доктор прописал? Но есть пара нюансов:
а) Она работает только для actions, то есть нажатия кнопок. А для axises (мышь, стики) вроде бы не работает.
б) Одна нода работает только для одного action.
То есть, нужно создавать их для каждого действия отдельно. Это хороший вариант, если нужно сделать, например, чтобы кнопки в меню оставались рабочими, но работали как-то иначе чем в игре. А если нужна только одна Esc, то для всего остального нужно будет делать затычки. И если потом позже нужно будет добавлять новые действия, то для каждого придётся тоже делать затычку.
3) Отключать управление как обычно. Найти в блюпринте интерфейса штатную функцию OnKeyDown и сделать ей Override, куда добавить обработку Escape. Самый короткий и простой вариант, если нужна только одна кнопка. Я остановился на нём.
Нюанс: здесь нельзя принимать стандартные actions, кнопка здесь будет захардкожена. Если потом нужно будет поменять кнопку или добавить, то придётся проходить по всем меню и вручную править.
Менять Escape на другую кнопку для выхода из меню, конечно, никому в здравом уме в голову не придёт, а вот добавлять (например, кнопку на геймпаде) уже может быть нужно.
В любом случае, несколько недоумеваю: это супер-стандартный сценарий использования, нужно такое может быть буквально для каждой первой игры. Почему создатели не предусмотрели для этого какое-то каноничное решение для меня некоторая загадка.