こんにちは!こんばんは!
プログラム1課の若尾です。
10月ももうすぐ終わりますね。
皆様にとっては時節到来ですか?
私は最近の小寒の氷大寒に解くな気温の移り変わりに準備が時期尚早です。
あ、今皆さん「この言葉なんだろう」
と思い検索してくださったのではないでしょうか!?
その時、このブログのウェブブラウザタブから離れたのではないでしょうか。
もしこれがブログではなく、アクションゲーム🕊️ だったら大変ですよね!
というわけで、アクションゲームなどで別のアプリケーション・離席時などウィンドウから離れた際にゲームがポーズして止まってくれるような機能を作ります!
実装環境について
Microsoft Windows 11 Pro
バージョン 10.0.22621 ビルド 22621
インストール済みの物理メモリ (RAM) 64.0 GB
CPU:12th Gen Intel(R) Core(TM) i7-12700
GPU:NVIDIA GeForce RTX 3070
UnrealEngine バージョン: 5.2.1
- Visual Studio 2022 17.7.4
▼実装順序
- UE5を起動し「サードパーソン」テンプレートでプロジェクトを作成(既存ゲームプロジェクトに追加する場合は不要)
- ゲームを一時停止させるポーズ画面を作成
- プラットフォームのゲームが非アクティブになる際のイベントを登録
この時に,ポーズ画面が出るようにする - Windowsでの実装・確認のためにUE5内のコードを追記
ゲームプロジェクトを用意し、ゲームを一時停止できるポーズ画面を作成します。そしてそのポーズ画面を、ゲームが非アクティブ状態になった際に呼ばれるように実装していきます。
1.UE5を起動しThirdPersonShootingテンプレートでプロジェクトを作成
EpicGamesLauncherからUE5を起動して新しいプロジェクトを作成します。
今回はポーズされているかどうかわかりやすいように「サードパーソン」を選択してプロジェクトを作成します。
既にここまで出来上がっている状態なので、気軽で良いですね!
今回は止まっていることがわかるように、ジャンプの高度を高めに設定します。
2.ゲームを一時停止させるポーズ画面を作成
コンテンツ画面から右クリックをして、ポーズ画面となるWidgetを作成します。
今回はWidget\PauseWidgetという名前で作成しました。
今回ポーズ画面のデザインは本実装の目的ではない為、簡素に作成します。
ポーズ画面からゲーム画面に戻れるように
Return
ボタンを作成します。そのボタンのOnlicked のイベントを追加して、下図のようなゲームポーズ解除を施す命令を追加します。
上記で作成したポーズ画面を出しつつ
ゲームを一時停止させる
処理をプレイヤーに追加して、実際にゲームが止まるかを確認します。
今回はプロジェクト設定からポーズ画面呼び出しのインプット設定を追加して、そのイベントアクションをBP_ThirdPersonCharacterに追加します。
ポーズ画面を呼び出す処理は下図のブループリントで作成しました。
実際にゲーム上でPキーを押してポーズ画面を呼び出してみます。
実際にゲームがポーズ(一時停止される)のがわかるかと思います。
Return を押すと再びゲームに戻れます。
3.プラットフォームのゲームが非アクティブになる際のイベントを登録
この時に,ポーズ画面が出るようにする
このようなイベントを簡単に登録できるコンポーネントが既に用意されています。
BP_ThirdPersonCharacterのコンポーネントに
「ApplicationLifecycle」という名前のコンポーネントを追加します。
追加したApplicationLifecycleをクリックし、詳細タブのイベントにある
ApplicationWillEnterBackgroundDelegate の + をクリックして、新たなイベントトリガーを作成します。
これを先ほど作成したポーズ画面作成命令部分(インプットアクション OpenPause) と同じピンにつなぎます。
これで、ゲームウィンドウが非アクティブになった際に、ポーズ画面を開くことができます!
…なのですが
実は、この初期状態ではPC版以外のコンソールやモバイルでしか上記で追加したイベントが呼ばれません。
そこで、PC版(今回はWindows版)でも表示が出来るように,Engine側のソースに追記をします。
ここからは内容が難しくなっていきますが
是非やってみましょう!🕺
4.Windowsでの実装・確認のためにUE5内のコードを追記
ここからはUnrealEngine内のソースを編集する必要があるため
下記公式ドキュメントを参照して、ソースコードを取得してください🙇♂️
エンジンの取得・ビルド確認まで出来ましたら
UE5エディタ及びVisualStudioを一旦閉じます。
そして、いままで編集していた既存の.uprojectファイルを右クリックして
「Switch Unreal Engine version」を選択して、取得したEngineのフォルダを指定します。
そして、作成された.sln ソリューションファイルからVisualStudioを開きます。
ゲームプロジェクトをスタートアッププロジェクトに設定しておきます。
ここまで準備できましたら
~~Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp
2404行目付近
こちらに下記を追加します。
case WM_ACTIVATE:
{
EWindowActivation ActivationType;
if (LOWORD(wParam) & WA_ACTIVE)
{
ActivationType = bForceActivateByMouse ? EWindowActivation::ActivateByMouse : EWindowActivation::Activate;
}
else if (LOWORD(wParam) & WA_CLICKACTIVE)
{
ActivationType = EWindowActivation::ActivateByMouse;
}
else
{
ActivationType = EWindowActivation::Deactivate;
/********↓ここを追加↓*********/
FCoreDelegates::ApplicationWillEnterBackgroundDelegate.Broadcast();
}
bForceActivateByMouse = false;
UpdateAllModifierKeyStates();
if ( CurrentNativeEventWindowPtr.IsValid() )
{
BOOL Result = false;
Result = MessageHandler->OnWindowActivationChanged( CurrentNativeEventWindowPtr.ToSharedRef(), ActivationType );
return Result ? 0 : 1;
}
return 1;
}
break;
この編集を保存して
ソリューションエクスプローラの「Games」下のゲームプロジェクトをスタートアッププロジェクトに選択して、デバッグの開始(F5キーを押す)します。
再び,エディタ画面が起動します。
ここで、プレイインエディタでも
ゲームウィンドウからフォーカスが外れて非アクティブになると
ゲームを一時停止させるポーズ画面が出現します。
上記の動画のような動きが出来るはずです。
終わりに
実はApplicationLifecycleコンポーネントには様々なイベントが用意されているのが確認できると思います。
今回のポーズ画面を出現させる以外にも
- 非アクティブ時やゲーム終了時にオートセーブする
- オンラインゲームなら制限をかける
- 画面を隠す
- オートプレイモードに移行する
などなど様々な応用が可能となりますので
是非いろいろと試してみてください。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。