執筆バージョン: Unreal Engine 5.5
|
みんな! ゲームをリリースしたいかー!
家庭用ゲーム機でもゲームをリリースしたいかー!
プラットフォーマーのチェックは怖くないかー!
というわけで(?)、今回はEKeys::Virtual_Acceptをご紹介したいと思います。
はじめに
UEはマルチプラットフォームに対応したゲームエンジンなので、各種家庭用ゲーム機向けのビルドを行えますが、その時に問題になるのがゲームパッド操作時の決定ボタンの位置です。
メニュー画面のキー操作で、どのボタンを決定ボタンとするかプラットフォーム毎に異なります。
大抵のプラットフォームでは、ひし形に配置された4つのボタンの内、下のボタン(UE的に言うとFKey::Gamepad_FaceButton_Bottom)が決定ボタンとなっていますが、一部のプラットフォームでは右のボタン(FKey::Gamepad_FaceButton_Right)が決定ボタンになっています。
この決定ボタンの位置の差異を吸収してくれるのが、EKeys::Virtual_Acceptになります。
EKeys::Virtual_AcceptはFKey型の変数で、FKey::Gamepad_FaceButton_Bottom かFKey::Gamepad_FaceButton_Rightのいずれかが代入されています。
(エンジンコードのInputCoreTypes.cppにて実際に代入が行われていますので、実装に興味があったら見てみてください!)
FKey::Gamepad_FaceButton_Bottomを直接使うのではなく、EKeys::Virtual_Acceptを利用する事でプラットフォーム毎に処理を書き分けなくても、正しく決定ボタンを処理できるようになります。
それでは、このEKey::Virtual_Acceptを使ってキーガイド表示を作っていきましょう!
ブループリントへの公開関数を作る
EKeys::Virtual_Acceptはブループリントからアクセスできないので、これを公開する関数を作成しましょう。
今回はBlueprintFunctionLibraryにて実装します。
|
UCLASS() class BLOG_VIRTUALACCEPT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() UFUNCTION(BlueprintCallable, BlueprintPure) static FKey GetAcceptKey(); UFUNCTION(BlueprintCallable, BlueprintPure) static FKey GetBackKey(); }; |
|
FKey UMyBlueprintFunctionLibrary::GetAcceptKey() { return EKeys::Virtual_Accept; } FKey UMyBlueprintFunctionLibrary::GetBackKey() { return EKeys::Virtual_Back; } |
GetAcceptKey()はEKeys::Virtual_Acceptをただ返すだけ関数。
もう一つの関数 GetBackKey()はEKeys::Virtual_Backを返しています。
EKeys::Virtual_BackはEKeys::Virtual_Acceptと同様の機能で、決定ボタンではなくキャンセルボタンを示しています。
これ以上ないくらいシンプルな関数ですが、これで十分です。
ウィジェットの作成
ImageとTextを組み合わせて、キーガイドのウィジェットを作成します。

ウィジェットのデザインが出来たら、こちらのImage(白い四角)をコンストラクションスクリプトでアイコン画像に変更されるようBPを組んでいきましょう。
まずはキーをFKey、値をTexture2Dとした連想配列を作成して、デフォルト値を設定しておきます。

あとはEvent ConstuctでそれぞれのImageにSetBrushするのですが、ここで先ほど作ったGetAcceptKey()を使用します。
GetAcceptKey()が返してきたEKeys::Virtual_Acceptをキーにして連想配列からTexture2Dを取り出して使用します。

ここまで出来たらレベルブループリントのBeginPlay等で、作成したウィジェットを表示させてあげれば完成です!
実際に家庭用ゲーム機向けにビルドを作らないと動作確認しにくいのが難点ですが、大丈夫!UEを信じろ!

余談 決定ボタンの動作について
実際に決定キーがFKey::Gamepad_FaceButton_BottomとFKey::Gamepad_FaceButton_Rightのどちらなのかを判別して切り替える処理は、実はすでにUEが対応してくれていますので特別にやる事はありません。
エンジンコードのNavigationConfig.cppを確認すると、下のようにEKeys::Virtual_Acceptが利用されていることが分かります。
|
// By default, enter, space, and gamepad accept are all counted as accept KeyActionRules.Emplace(EKeys::Enter, EUINavigationAction::Accept); KeyActionRules.Emplace(EKeys::SpaceBar, EUINavigationAction::Accept); KeyActionRules.Emplace(EKeys::Virtual_Accept, EUINavigationAction::Accept); |
さいごに
無事にゲームが完成したらPC版だけでなく、家庭用ゲーム機でもリリースしたいですよね!
その時にはぜひEKeys::Virtual_Acceptの事を思い出していただきたいと思います。