目次
概要
UE4でのKeyConfigの作成の参考になるPluginを公開しました。
鋭意開発中でまだまだ機能不足が目立ちます。
ProjectDirのPlugins以下に以下のPluginsを入れれば動作します。
github.com
ProjectSettingsのAction Mapping / Axis Mappingで設定した名前を元に変更します。
初期のバージョンでの実装
現在用意しているノードについて
- 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で上書きするというものです。
一番シンプルな使い方です。
続いてNodeの一覧です。
ざっくり分けると以下の3カテゴリに分かれています。
- Keyの更新
- Gamepadでのマウスカーソル有効化/無効化
- Key情報の検索
サンプルの画面がこちらです。
Keyboard, Gamepadそれぞれで任意のKeyの割当ができるようなサンプルを用意しました。
参考資料
スライド内のp.48
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の作り方
こちらのPluginにRebind系とGamepadのUMGでの使用するための機能が一通り揃っていますので、こちらを使用されるのも良いかと思います。
GitHub - EverNewJoy/VictoryPlugin: Rama's Victory BP Plugin
https://github.com/EverNewJoy/UE4GamepadUMG