Unreal Engine
March 16, 2023

Проблема с нодой Set Input Mode Game Only

На связи снова Superyateam, и он разбирается с нодой Set Input Mode Game Only в Unreal Engine 4.

Используете ли вы в своей игре ноду Set Input Mode Game Only? Сталкивались ли вы со странным поведением контроллера пользовательского ввода? Если да, то оставайтесь со мной: я как раз собираюсь пролить свет на то, как эта функция работает под капотом.

В Unreal Engine 4 есть три режима ввода:

  • Game Only
  • UI Only
  • Game and UI

Если в двух словах, то режим Game Only предназначен для игрового контроллера, режим UI Only, очевидно, для пользовательского интерфейса, а Game and UI лучше всего подходит для игр с богатым пользовательским интерфейсом (например, типичной RTS). Не буду вдаваться в в подробности, не это цель данной статьи. Если вам нужна информация об этих режимах, можете посмотреть это видео, довольное полезное.

Оно охватывает практически все, что вам нужно знать. За исключением одной вещи, однако, которой автору не хватает. Это Set Input Mode Game Only, и чем она отличается от режима ввода по умолчанию в UE4?

Проблема Set Input Mode Game Only

Когда я реализовывал меню для своей игры, я столкнулся с проблемой, похожей на эту: https://answers.unrealengine.com/questions/420047/an-lmb-event-is-only-triggered-with-a-double-click.html.

После выхода из меню и переключения обратно в режим Game Only мне приходилось дважды щелкать мышью или делать двойной щелчок, чтобы мышь снова заработала. Я попробовал использовать Set Input Mode Game и UI, но это было не совсем то, что я хотел. Причина, по которой режим Game Only не работал, заключалась в том, что этот режим не является режимом по умолчанию в UE4.

Давайте рассмотрим раздел Project Settings → Input проекта UE4. Вы увидите, что Default Viewport Mouse Capture Mode может иметь следующие возможные значения:

Список значений для Default Viewport Mouse Capture mode

Значение по умолчанию может быть таким: «Capture Permanently Including Initial Mouse Down», или другим. Проблема, однако, в том, что параметр Set Input Mode Game Only сбрасывает это значение, заменив его на «Capture Permanently». И если последнее не является значением по умолчанию, ваша игра не будет работать так, как вы ожидаете.

Решение

Теперь давайте проверим исходный код. Откройте файл WidgetBluprintLibrary.cpp и метод UWidgetBlueprintLibrary: SetInputMode_GameOnly.

Реализация Set Input Mode Game Only
Конструктор Game Only Input Mode
Метод Apply Input

Вы видите, что вызов этого метода просто создает новый объект без аргументов, что равносильно установке Default Viewport Mouse Capture Mode на «Capture Permanently». Если же вам нужны другие значения, вам придется инициализировать режим ввода вручную.

Я сделал небольшую вспомогательную функцию в классе контроллера игрока. Она не универсальна, но отлично подходит для моих нужд. Взгляните, возможно, это то, что вы ищете:

void MyPlayerController::SetInputModeGameOnly(bool InConsumeCaptureMouseDown)
{
    FInputModeGameOnly InputMode;
    InputMode.SetConsumeCaptureMouseDown(
        InConsumeCaptureMouseDown);
    SetInputMode(InputMode);
}

Оригинал: https://superyateam.com/2019/10/01/problem-with-set-input-mode-game-only-node/