PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 KeyConfig作成用のPluginを公開しました

目次

概要

UE4でのKeyConfigの作成の参考になるPluginを公開しました。
鋭意開発中でまだまだ機能不足が目立ちます。

ProjectDirのPlugins以下に以下のPluginsを入れれば動作します。
github.com

ProjectSettingsのAction Mapping / Axis Mappingで設定した名前を元に変更します。

初期のバージョンでの実装

現在用意しているノードについて
f:id:PaperSloth:20200511131004p:plain

- ChangeMapping
Action/Axisどちらかのキーの変更用ノード
  BindName : Action/Axis Mappingで設定した変更したいキーの名前
  Key : FKeyの構造体、AnyKey等で取得するのが楽です
  BindType : ActionかAxisのどちらか
  PlayerIndex : 変更を適用したいPlayerControllerの番号(デフォルトは0)
- ChangeActionMapping
Action Mappingで設定したキーの変更用ノード
- ChangeAxisMapping
Axis Mappingで設定したキーの変更用ノード
  Scale : 基本的には-1.0 - 1.0 で指定 ProjectSettingsのAxis Mappingと同様
- GetAllActionMappingNames
Action Mappingで設定したキーの名前一覧を取得するノード
  ActionNames : Action Mappingで設定したキーの名前一覧
- GetAllAxisMappingNames
Axis Mappingで設定したキーの名前一覧を取得するノード
  AxisNames : Axis Mappingで設定したキーの名前一覧
実装概要

GitHubに公開してるので、実装をそのまま見てもらえれば早いんですが、簡単に概要だけ書きます。
まず、FKey構造体を使用するためBuild.csのPublicDependencyModuleNamesにInputCoreを追加しておく必要があります。

PublicDependencyModuleNames.AddRange(
    new string[]
    {
        "Core",
        "InputCore", // 追加
    }
);

Mapping系について
PlayerInputからActionMappings配列内の同名のAction/Axisを削除し、新しくKeyを設定して追加しています。
Axisに関しても同様の実装になっています。

const APlayerController* const PC = UGameplayStatics::GetPlayerController(WorldContextObject, PlayerIndex);
UPlayerInput* const PlayerInput = PC->PlayerInput;
PlayerInput->ActionMappings.RemoveAll([&ActionName](const FInputActionKeyMapping& NowMapping)
{
    return (NowMapping.ActionName == ActionName);
});

const FInputActionKeyMapping AddMapping(ActionName, Key);
PlayerInput->AddActionMapping(AddMapping);

GetAllXX系について
こちらはUInputSettingを取得してそこに登録されているAction/Axis名を取得して
配列に格納して返しているだけです。

ActionNames.Empty();

const UInputSettings* Settings = GetDefault<UInputSettings>();
for (const FInputActionKeyMapping& Action : Settings->GetActionMappings())
{
	ActionNames.Emplace(Action.ActionName);
}


特に細かく語るほどのことがないシンプルな実装なので、C++を書ける人はPluginを導入せずに自分で書いた方がなにかと都合がいいと思います。

追記: 大幅に仕様を変更し、サンプルプロジェクトを追加

以前の実装との違い
更新内容
1. Gamepadでのマウスカーソル移動が可能になった
2. Sampleを用意したため、より具体的な使い方のイメージができるようになった
3. iniへの書き込みを行うようにしたため、変更内容が保存されるようになった
4. Keyboard, Gamepadそれぞれでの変更が可能となった

なくなった機能
1. Axis対応の破棄(機能不十分のため一旦見送り)
2. 複数PlayerControllerに対応できなくなった
対応するにはコードの書き換えが必要です

まずは最小構成のNodeのサンプルです。
登録したAction名に対して任意のKeyで上書きするというものです。
一番シンプルな使い方です。
f:id:PaperSloth:20200516004514p:plain

続いてNodeの一覧です。
f:id:PaperSloth:20200516004506p:plain
ざっくり分けると以下の3カテゴリに分かれています。

  • Keyの更新
  • Gamepadでのマウスカーソル有効化/無効化
  • Key情報の検索

サンプルの画面がこちらです。
Keyboard, Gamepadそれぞれで任意のKeyの割当ができるようなサンプルを用意しました。
f:id:PaperSloth:20200516004458p:plain

参考資料

スライド内のp.48
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の作り方

こちらのPluginにRebind系とGamepadのUMGでの使用するための機能が一通り揃っていますので、こちらを使用されるのも良いかと思います。
GitHub - EverNewJoy/VictoryPlugin: Rama's Victory BP Plugin
https://github.com/EverNewJoy/UE4GamepadUMG