セーブ&ロードやセッティングが上手くできたので、タイトル画面のメニューと連動させました。
Unreal Engineのバージョンは5.3.0 Preview 1です。
やっと納得のいく仕様の基本メニューとセーブ&ロードができた。
これさえあればミニゲームのチュートリアルもゲームとして完成させられそう。#UE5 #アンリアルエンジン pic.twitter.com/erXGeZIWOo— ハマーキーUE (@Hummerkey_UE) August 22, 2023
W_TitleMenu(ウィジェットブループリント)
作成:ウィジェットブループリント
親クラス:User Widget
名前:W_TitleMenu
デザイナー
Canvas Panelを配置。
Canvas Panelの子としてBorderを配置。
・名前をBackgroundにしました。
・アンカーを全画面にします。
・オフセットは全て0にします。
画面全体に広げてタイトル画面の背景にします。
Brush > Imageで画像も使えます。
今回は真っ黒。
Canvas Panelの子としてVertical Boxを配置。
その子としてImageを配置し、名前をTitle Logoにします。
これらはタイトルロゴを表示するためのものです。位置とサイズもそれ用に合わせる。
Imageを追加で配置して重ねることも可能です。
今回は真っ黒。
Canvas Panelの子としてVertical Boxを配置。
下層のVertical Boxの子としてButtonを4個配置。
・名前を上から「Button_NewGame」「Button_Load」「Button_Settings」「Button_QuitGame」にしました。
・Horizontal Alignmentを右。
・Vertical Alignmentを左から2番目。
・Style > Normal > Tint > Aを0.0。
・Style > Hovered > Tint > Aを0.0。
・Style > Pressed > Tint > Aを0.0。
ボタン自体は透明化してテキストのみ表示させるためです。
Buttonの子としてTextを配置。
・名前を上から「Text_NewGame」「Text_Load」「Text_Settings」「Text_QuitGame」にしました。
・Is Vatiableにチェックを入れます。
・コンテンツ > Textを上から「ニューゲーム」「ロード」「セッティング」「ゲーム終了」にします。
Vertical Boxの位置とサイズはタイトルメニューに適したサイズにします。

マウスHoverとキーボードFocusの同期
キーボードFocusに合わせてテキストカラー変更

イベント TickでButtonがFocusされているかを全チェックして、Focus中のButtonに対応したテキストのカラーとフォントサイズを変更。
FucusedTextColorという変数でButtonがFocusされている時にテキストの色を赤にして、FocusedTextFontという変数でサイズを28にしています。
それぞれRemoveという変数を使い、一番最初にテキストのカラーとサイズをリセットしています。
ボタンクリックの処理
ロード画面とセッティング画面を閉じる処理
TitleMenu(レベル)
ファイル > 新規レベル > 空のレベルを作成。
Mapsというフォルダを作成し、TitleMenuとして保存します。
上メニューの階層アイコンをクリックし、レベルブループリントを開くを選択。

Set User Focusが利かなくて悩みましたが、Set Input Mode Game And UIのIn Widget to FocusにButtonを設定するだけで良かったんだと知りました。
今回はButtonは透明のままでテキストに色をつけますから、ウィジェットを開いたタイミングでText StartにSet Color and Opacityで色をつけています。
BP_GameModeTitle(ゲームモード)
親クラス:Game Mode Base
名前:BP_GameModeTitle
W_MainMenu(ウィジェットブループリント)
ゲームプレイからタイトル画面に戻る設定をします。
まずW_MainMenuの表示テキストである「SAVE」「LOAD」「SETTINGS」「QUIT」を「セーブ」「ロード」「セッティング」「タイトルに戻る」に変更しました。

タイトル画面に戻るだけならOpen Level (by Name)だけで良いのですが、Slot Nameをリセットしておかないと、タイトル画面でニューゲームをクリックした時に、既存のセーブデータをロードしてしまいます。
ニューゲームをクリックした時にSlot Nameをリセットする仕様にしても良いです。
BP_Player(プレイヤーブループリント)
Bボタンでメインメニューを閉じる
タイトルメニューのロードとセッティングはBボタンやマウス右クリックで閉じることができますが、ゲームプレイ中のメインメニューはBボタンやマウス右クリックで閉じられなかったので修正しました。
コンテンツ > ThirdPerson > Input > ActionsにInput Actionがあります。IA_Jumpを複製してIA_MainMenuCloseにしました。
Pause中に使いますから、Trigger when Pausedにチェックを入れる必要があります。
TriggersはPressedのみで構いません。

コンテンツ > ThirdPerson > InputにあるIMC_DefaultにIA_MainMenuCloseを追加します。
Bボタン、右クリック、Q、Escでメニューを閉じられます。ちなみにEscはUnreal Engineのテストプレイ自体を閉じてしまいます。
メニューを開くボタンである特別仕様の右とTabもFlip FlopのB(偶数回)として利きますから当然ながら閉じられます。


Bボタンらでメインメニューが開くと困りますから、Flip FlopのIs AがTrueであるかどうか、つまりA側のノードが完了しているかどうかをブランチで判断しています。
これらはFlip Flopの前に繋いでおかないと、Flip Flopが完了しないままメニューを閉じてしまいますので、次にMainMenuを開く時にボタンを2回押さないと開きません。
TitleMenu(レベル)
TitleMenuのレベルブループリントもEnhanced Inputに対応させました。







コメント
こんにちは、いつもお世話になっております。
セーブやメニューなどの一連の記事を拝見して真似してノードを組んでいたのですが、tabキーで開いたメニューをtabキーで閉じることができなくて困っています。(右クリックで閉じることはできます)
何回かやり直して同じようにやってみてはいるのですが、上手くいかず原因がわかりません。
何か見落としてそうなポイントがあれば教えていただけると幸いです。
こんにちは
こちらは古い記事で、メニューの切替にFlip Flopを使っているのですが、今の考え方ではFlip Flopは無駄にわかりにくくなってしまうので良くないと思っています。
メニューが開いているかどうかの変数を作り、それで処理を切り替えた方が良いです。
***開くボタン***
まず入力インプットのボタンを開くノードから、
Flip Flopとそれに繋がっているブランチを削除し、ブランチを1つのみ配置します。
OpenMenu?というブーリアンの変数を作り、そのブランチに繋げます。
これは既にメニューが開いているかどうかの変数です。
OpenMenu?がTrueであれば、既にメニューが開いているということなので、ブランチのTrueからはメニューを閉じる方の処理に繋げます。
その処理の最後にセット OpenMenu?を配置してチェックを外します。メニューが閉じられるのでチェックを外すわけです。
Falseであれば、まだメニューが開いていないので、ブランチのFalseからはメニューを開く処理に繋げます。そしてその処理の最後でセット OpenMenu?にチェックを入れてTrueにします。
***閉じるボタン***
入力インプットの閉じる専用ボタンのノードからは、同じようにブランチを配置して繋げて、OpenMenu?の変数を繋げます。
こちらはFalseの場合は何も処理しません。閉じる専用ボタンなのでメニューを開かせたくありません。
ブランチのTrueのみ、閉じる処理に繋げます。
***テストプレイ時のキー入力の注意点***
あと、テストプレイする時に「選択ビューポート」「新規エディタウィンドウ」だと、一部のキーがエディタ専用の役割になってゲームプレイで反応しない場合があります。「スタンドアロンゲーム」なら実際にPCでゲームをプレイする時とほぼ同じ仕様になります。
ノードに間違いがないのにキー入力が反応しない場合は「スタンドアロンゲーム」でテストしてみると良いでしょう。
TabキーがUIモード中にエディタ専用の役割になっていて反応しない可能性もあります。
ありがとうございます! Flip Flopを使わない方法があるんですね。勉強になりました!
しかし、教えていただいた通りにやってみたのですが、同じキーを使ってメニュー画面を開けたり閉じたりすることはできませんでした。
開けるボタンと閉じるボタンで操作するキーを分けた場合は正常に動作するので、ノードには間違いはないと思います。Tab以外のキーやスタンドアローンも試してみました。
とても難しいです。
もしかしたら開くボタンの入力アクション(IA_*****)のTrigger when Pausedにチェックが入っていないのかもしれません。
ポーズ中でもこの入力アクションを有効にするかどうかのチェックです。チェックが入っていればポーズ中でも有効です。
Trrigger when Pauasedのチェックも確認しましたがやはりうまくいきませんでした。
ウィジット等の表示非表示を切り替えるとき、同一のキーや操作をEnhanced Input Action で登録すると両方とも機能しなくなるのですが、これは仕様ではないのでしょうか?
Tabキーを開く方のインプットアクションにも閉じる方のインプットアクションにも入れているということですか?
だとしたら矛盾するので機能しないと思います。
Tabキーは開くボタンのインプットのみに入れておけば、OpenMenu?の変数によって開くのも閉じるも対応しています。
そうなんですね、両方のインプットアクションに入れていました。
これは解決したかと思って、閉じるほうのインプットアクションからTabキーを削除たのですが、またしても上手くいかず
一つ一つ辿って検証したところ、開くボタンから続く Set Input Mode Game Only から Set Game Paused のノードを切り離したところ
同一キーでのメニュー開閉だけはできるようになりました。質問する前に原因を絞っておくべきでした。すみません><
となるとポーズ中に入力が利かなくなっていた可能性が高いですね。
なんにしても1つ原因がわかったようで良かったです。