VictoryPluginを使ってKeyConfigを動的に変更する

More than 3 years have passed since last update.

※2015/08/02 UE4.8.3時点での記事となります

ゲームの使い勝手を向上するためにはユーザが自由にKeyConfigを変更できる機能が必要になります。

UE4コミュニティでも有名なRamaさんが作成した「VictoryPlugin」を使用すれば、サンプルPJもあるため比較的にさくっと実装できます。

といっても私も今日始めて触りさくっと調べただけなのですが、

コミケ前のこの時期ならきっと需要があるはずなのでメモ程度ですが記事の残しておきます。

※なお、間違いとかわからない点もあるので要点だけ理解し記載した内容です

基本的には、RamaさんのサンプルPJにあるBPの自分メモ解説記事になります。


使用するPluginに関連するフォーラムスレッド

まずはざっくり見ること。

https://forums.unrealengine.com/showthread.php?51449-Full-Project-Rama-s-UMG-Rebindable-Key-System-Rebind-keys-at-Runtime


参考にしたサンプルPJ(Ramaさん作)

PJ名:ReBindableKeys

最新版は以下のリンクで管理されている模様。

先のフォーラムスレッドのTop記事っからリンクがはられていますが、念のため。

https://wiki.unrealengine.com/File:ReBindableKeys.zip


メリット(自分メモ)

・動的にConfigを変更できる

→ユーザが自分の都合に合わせてプレイ中に変更できる機能を実装できる

→開発者がデバッグなりキー配置を検討する際に実行中に調整できて、PJのデフォルト値として直ちに更新できる。(ただし、ビューポートなどPJと同じエディタから実行した場合に限ると推測)

・Ramaさん作のPluginなので今後のUE4VerUp後でも対応してもらえて継続して使用できるのではと推測(希望的観測)

・Ctrl、Shift、Altの同時押しもサポート(サンプルPJで動作確認済み)


デメリット(自分メモ)

・動的に配置を更新したあと起動の仕方によってはPJのデフォルト値として勝手に書き換わってしまうので、注意が必要。

→特に、エディタからビューポートでデバッグ起動しテストプレイでコンフィグを更新した場合、PJ固有設定も同時に書き換わる

ただし、スタンドアローン版でデバッグ起動した場合、コンフィグの更新がPJ固有の設定まで更新されずリセットされるので、これなら大丈夫。

・ユーザの独自Pluginなので、特にドキュメントはなくフォーラムで聞くとかサンプルで学ぶしかない点。

→同時に、そのうち開発者の都合でPluginから外されサポート外になる可能性もある事かも?


未確認

・復数のゲームパッドから入力を受け取れるのか?

→割と重要ですが、そこまで試す気力がないのでやってません。


Victory Pluginについて

なんでもありなPluginです。

いい意味で、BPありすぎて何が出来るのか把握できないです。。。

https://forums.unrealengine.com/showthread.php?3851-(39)-Rama-s-Extra-Blueprint-Nodes-for-You-as-a-Plugin-No-C-Required!

最近ですと、絶対パスを取得できたり、capture機能があったりするらしいです・・・。

もう、コレ一つあればいいんじゃね?と思いたくなるPluginな印象です。

さて今回使用するBPは以下です。

Asix版のNodeについては量が増えるので省略。基本的な処理内容はほとんど同じ。


Victory Get All Action key Bindings

RamaVP_GetAllActionKeyBindings_Node.jpg

※Asix版の型もある

IO
名称

備考欄

Out
Bindings
VictoryInput構造体の配列
現在のActionMappingsの設定値を配列で全て取得


Victory Get Victory Input

RamaVP_VictoryGetVictoryInput_Node.jpg

※Asix版の型もある

IO
名称

備考欄

In
KeyEvent
KeyEvent型 リファレンス
例:Widget BPのOnKeyDownの in Key Eventとつなげて使用する

Out
ReturnValue
VictoryInput構造体
KeyEvent型からPlugin専用のVictoryInput型に変換しただけ


VictoryInput 型 Node (例:Break Node)

RamaVP_VictoryInput_Node.jpg

構造体の作成、解除系Nodeなので必要な要素だけ解説。

※Asix版の型もある

IO
名称

備考欄

Out
ActionName
String
PJ毎に設定するActionMappingsで設定した名称

Out
Key As String
String
ActionNameに該当するKeyのString版

Out
Shit,Ctrl,Alt,Cmd
Bool
有無


Victory ReBind Action Key

RamaVP_VictoryReBindActionKey_Node.jpg

※Asix版もあるがInの型が異なる。処理内容は同じ

IO
名称

備考欄

In
Original
VictoryInput構造体
ReBindする元のActionMapping情報が設定されたVictoryInput型データ

In
NewBinding
VictoryInput構造体
ReBindする新しいVictoryInput型データ

Out
ReturnValue
Bool
実行結果


設定したConfigの保存先について

ソースを見たところ、コメント文から以下のファイルに書き込まれるそうです。

Saved/Config/Windows/Input.ini



実行例:その一:現在のActionMappingsを取得(表示する)

KeyConfigをするには現在の設定を取得する必要がありますが、

VictoryPluginにあるBPおよび構造体を使うと簡単に習得できます。

なお、他のMapping(Asix)について今回の記事では割愛します。

例として、現在の設定値が以下の場合を想定。

RamaVP_GetAllActionKeyBindingsDebug_PJConfig.jpg

VictoryPluginにある、「Victory Get All Action key Bindings」ノードを使用し、

TArray(VictoryInput構造体)の配列で現在の値を取得します。

後はForEachLoopで全てのKeyに対しShiftなどの追加Key有無を見て処理すればいいだけです。

(なお、下記の画像ではShiftなどの追加Key判定は除外しています)

VictoryInput構造体にはActionNameとそれに対応する実際のKeyが格納されていますのでセットで抽出します。

RamaVP_GetAllActionKeyBindingsDebug.jpg

先のBPを作成し、実行してDキーを押した結果が以下になります。

今回の記事では動作確認としてKeyとKeyStringの両方を表示しているので同じ内容が重複していますが、

ActionMappingsで設定した順番にPrintStringノードで出力した内容が表示されます。便利です。

当然、その2で解説する動的変更を実施した後であれば、最新版の情報を取得出来ます。

RamaVP_GetAllActionKeyBindingsDebug_Printf.jpg


Asix版

面倒なので省略。

こんな感じで作ればよいかと。

RamaVP_GetAllAsixsKeyBindingsDebug.jpg


実行例:その二:現在のActionMappingsの内容を動的に変更する

さて、ようやくメインとなる動的にConfigを変更する方法ですが、

一部理解していない箇所もあるので、申し訳ないですがそこについては割愛します。

基本は最初に紹介したサンプルPJ(ReBindableKeys)をベースに説明しています。

なお、画像に関してはRamaさんのサンプルPJをほぼそのままSSを撮っています。

一部、日本語での説明用コメント追加やConfig更新に必要のない箇所は折りたたみNodeとして手を加えています。

基本はMyCharactorのBPで設定画面表示などを制御しています。

簡単なデバッグとかであればここにかけばいいかと。

各Mappingsの更新処理はUIのBPに記載されています。

ActionMappingsであれば「Main_ByRama」、Asixであれば「AsixMain_ByRama」の各BPを見れば載っています。

ちなみに、element_ByRma系のBPもサンプルPJでは使っていますが、UI専用部分の話にもなるので省略。(私がわかってないだけですが…)

以下サンプルPJのSSですが、要点は各Nodeにコメント文を追加したところだと思います。

キー入力をUMG(例:Main_ByRama BP)で受付、その内容と比較しVictoryInput型(Asixなら別の型)で

Victory Rebind ~Nodeを呼べばConfig値が更新されます。正しく更新されたかはReturnBoolを見ればわかります。

RamaVP_Sample_UpdateVictoryKey.jpg

RamaVP_Sample_DynamicKeyBind.jpg

ざっくり解説ですが、以上です。

UE4のPluginは公式やマーケットプレイスに載ってないものになると、中々見つけづらいですがRamaさんのPluginは結構便利な機能があるはず(未調査)なので、コレを期に導入してみてはいかがかなと。