読者です 読者をやめる 読者になる 読者になる

GameProgrammar's Night

ゲームプログラム系の覚え書き

UnrealEngine4で2Dゲームを作ろう! その4 キーコンフィグ

 今回はキーコンフィグについてです。

キーマッピング

 UE4には、アクションキーマッピング・軸マッピングという入力にエイリアスを付けられる機能があります。ゲーム中での入力の扱いと実キー入力を分離できるとても便利なものです。
 [プロジェクト設定]→[入力]から[Bindning]の所で設定できます。

f:id:katze_7514:20150323172412j:plain

 上の画像で緑で囲ったとこです。画像が小さくて読めないと思いますが、"UP"という名前に対して、WキーとNum8キーを割り当てています。
 こうすることで、UP入力をチェックすることは、W・Num8キーの両方をチェックすることと同じ意味になります。

 UPという入力がBPなどからチェックできるようになります。

f:id:katze_7514:20150323173135j:plain

 このキーマッピングの仕組みがあれば、キーコンフィグを簡単に実装できる! はずなのですが、UE4では一手間・二手間掛かります。
 なぜなら、マッピングを設定する手段が、今紹介したプロジェクト設定しか無いからです。ゲーム中にキーコンフィグ画面を出して、キーマッピングを動的に変化させることが素直には実装できません。

 現状思いついたキーコンフィグ実装について2つ紹介したいと思います。

作戦1 ゲーム起動前にキーマッピング編集アプリで設定する

 キーマッピングは、いつものiniファイル上に書けますので、その編集ツールを作り、ゲームに同梱しそれを使ってもらう。
 STGなど操作ボタンが少ないゲームならば、これでも充分でしょう。

 DefaultInput.ini というファイルを作り、以下のように記述します。

[/Script/Engine.InputSettings]
ActionMappings=(ActionName="UP",Key=W,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
; 以下必要なだけ記述

 細かいフォーマットは各々調べて下さい。自分もまだちゃんとは調べてないもので。

作戦2 動的に変化できるようにしちゃう!

 本題です。

動的に変化できないなら、しちゃえば良いじゃん。ソースあるしさ。by 俺

 というわけで動的に変化できるようにします。

 キーマッピングを追加するには、UInputSettingsクラスのAddActionKeyMapping/AddAxisMappingメソッド(以下Mappingメソッドと呼びます)を使います。
 折角なので、BPからも使えるようにBPの関数として定義したいと思います。

 ソースを見ればわかる通り、MappingメソッドはBPに公開されてません。MappingメソッドにUFUNCTIONマクロを足して公開するとエディタ/エンジンを自前でビルドすることになりますので、できれば避けたい所です。そこで、MappingメソッドをブリッジするC++コードを追加して対応します。

 [ファイル]→「プロジェクトにコードを追加……]→[Bluepirnt Function Library]を選択して、適当にファイル名を付けて[クラス作成]します。
 ここでは、ProtoBPFunctionLibraryと名前をつけたとします。
 生成されたProtoBPFunctionLibrary.h/cppを以下のようにします。

ProtoBPFunctionLibrary.h
#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "ProtoBPFunctionLibrary.generated.h"

UCLASS()
class PROTOTYPE_API UProtoBPFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

// 以下の三行を追加する	
public:
    UFUNCTION(BlueprintCallable, Category="ProtoBPFunction")
    static void AddActionMapping(FName actionName, FKey key);
// ここまで
};

 Blueprint Function Libraryとなるクラスのメソッドはすべてstaticで宣言します。

ProtoBPFunctionLibrary.cpp
#include "prototype.h" // プロジェクト名になります
#include "ProtoBPFunctionLibrary.h"

// 追加する関数の実装
void UProtoBPFunctionLibrary::AddActionMapping(FName actionName, FKey key)
{
    const FInputActionKeyMapping map(actionName, key);
    GetMutableDefault<UInputSettings>()->AddActionMapping(map);
}

 書いたら、UEのエディタの方でコンパイルを押してコンパイルします。これでBPノードとして使えるようになります。(自分の環境だと、コンパイルしたあとエディタを再起動する必要がありました)

f:id:katze_7514:20150323190803j:plain

 キーコンフィグUIを作ってこのノードを使えば、自由にキーマッピングが追加できるようになります。
 AddActionKeyMappingは前に設定したものを消さずに追加しますので、マッピングを消せるようにRemoveの方も同じように定義しておくと良いと思います。

 ざっとソースをさらった所、キー入力を取る所では毎回マッピングを見ながら入力を取っているので、わりと好きなタイミングで変えて大丈夫だと思います。

余談

 しかし、Mappingメソッドを外に公開してないのはなんでなんですかね? 海外のゲームでもキーコンフィグって普通に行われてると思うのですが……。むしろ、PCゲームだとなんでもショートカット作れるぐらいまでがっつりやれることの方が多いのに。