この記事に書かれていること
- UE5.0.2 時点での内容
- Common UI とは
- Common UI のPIEバグ
- ↑ の対策方法
この記事に書かれていないこと
- Common UI の導入方法
- Common UI の使い方
Common UI とは?
Common UI プラグインは、確認画面等のゲームのメニュー階層や、入力ボタンアイコンの管理と表示、タブボタン切り替え等の、主にゲームパッドでUIを操作する際の共通のUI機能をまとめたプラグインです。
UE5 で正式版として登場し、先述した通り(特にマルチプラットフォーム対応において)機能的にとても優秀なものとなっています。
Common UI のPIEバグとは?
今後修正される内容だと思われますが、 地味にストレスの貯まるバグ です。
PIE 中、ゲームパッド操作状態で(Quit Game
関数などで)ゲーム終了を行った場合、エディタ上でマウスが消え、以降いくつかのマウス操作に影響がでてしまうという厄介なバグです。
前者は別ウィンドウを一度アクティブにすれば解消されますが、後者は再度 PIE でキーボード操作上で終了させるまで残り続けてしまいます。
この記事ではそのバグの対処をエンジン(プラグイン)コードを弄らずに行う方法です。
バグ対策コード
以下のコードを、 PIE 終了時に処理させます。ここでは UCommonGameViewportClient
を継承し、ビューポートがデタッチされる時に処理しています。
プロジェクト設定→エンジン→基本設定→ゲームのビューポートクライアントクラス に以下のクラスを指定することを忘れないでください。
#pragma once
#include "CoreMinimal.h"
#include "CommonGameViewportClient.h"
#include "MyGameViewportClient.generated.h"
UCLASS(BlueprintType)
class MYPROJECT_API UMyGameViewportClient : public UCommonGameViewportClient
{
GENERATED_BODY()
public:
UMyGameViewportClient();
virtual void DetachViewportClient() override;
};
#include "MyGameViewportClient.h"
UMyGameViewportClient::UMyGameViewportClient()
: Super(FObjectInitializer::Get())
{
}
void UMyGameViewportClient::DetachViewportClient()
{
Super::DetachViewportClient();
// バグ対策コード
#if WITH_EDITOR
// CommonUI を使用する場合、非マウス・キーボード操作状態の時にPIEを終了すると、マウスが表示されない不具合への対処
{
FSlateApplication& SlateApplication = FSlateApplication::Get();
// 1. 戻ってすぐにマウスが非表示(キャプチャやロックがそのまま)になる不具合の対処
SlateApplication.UsePlatformCursorForCursorUser(true);
// 2. ブループリントエディタでピンをドラッグするなど、マウスポインタが変化する操作で非表示になる不具合の対処
if (TSharedPtr<FSlateUser> SlateUser = SlateApplication.GetUser(FSlateApplicationBase::CursorUserIndex))
{
SlateUser->SetCursorVisibility(true);
}
}
#endif
}
このバグは、エディタが管理している FSlateApplication
クラスの設定ミスにあります。そのため、スタンドアローンゲームやシッピングビルドでは発生しません。
なので、エディタービルド時にのみ処理するように WITH_EDITOR
で囲んでいます。