スレート ウィジェット を使用して、ヘッドアップ ディスプレイ (HUD) やメニューなどのその他のユーザー インターフェース (UI) を作成することができます。これらの UI は 1 つ以上のコンテナ ウィジェットで構成されており、各コンテナ ウィジェットは、UI の特定の側面を担ういくつかのタイプのウィジェットを保持する場合があります。
例えば、ゲームの HUD 用に 1 つ総合的なウィジェットだけでなく、メインメニュー、ポーズ メニュー、スコアボードなどのウィジェットもある場合があります。これらのウィジェットはそれぞれ他のカスタム ウィジェット、ラベル、テキストボックス、画像、その他の種類のエレメントで構成されています。
これらのコンテナ ウィジェットはそれぞれ、ゲーム内の状況に応じてユーザーの ビューポート に追加したり削除したりすることができます。
- ゲームが開始すると、ビューポートにメインメニュー ウィジェットが追加されます。
- メニューからオプションを 1 つ選択すると、メインメニュー ウィジェットがビューポートから削除されます。
- オプションが別のメニューを開くと、新しいメニューがビューポートに追加されます。
- どこかでプレイヤーがゲームを一時停止した場合、ポーズメニュー ウィジェットがビューポートに追加されます。
- ゲームが再開されると、ポーズメニュー ウィジェットがビューポートから削除されます。
- プレイヤーの HUD が初期化されると、 HUD ウィジェットがビューポートに追加されます。
プロジェクトの設定
スレート ユーザーインターフェース (UI) フレームワークを使用するためには、 フレームワークが認識されるようにプロジェクトを適切に設定する必要があります。これにより、Slate.h ヘッダーをインクルードしたり、スレートで UI をビルドするために必要な フレームワークの各種エレメントを参照できるよになります。
モジュールの依存関係
スレート フレームワークは、いくつかのモジュールに格納されています。プロジェクトがこれらのフレームワークを認識するためには、 プロジェクトに対して何らかの依存関係を *.build.cs ファイルで設定しなければなりません。
プロジェクトは、以下のモジュールにアクセスする必要があります。
モジュール | 依存関係の種類 |
---|---|
InputCore | Public |
Slate | Private |
SlateCore | Private |
スレート モジュールの依存関係の設定方法
- プロジェクトの [ProjectName].build.cs ファイルを開きます。格納場所は、[ProjectDir]/[ProjectName]/Source/[ProjectName] ディレクトリです。
-
"InputCore"
をPublicDependencyModuleNames
に追加して、 InputCore public dependency を追加します。PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
コード プロジェクトが作成されると、InputCore モジュールがデフォルトで依存関係が public として設定されます。
-
すべてのスレートと SlateCore の依存関係は private です。*.build.cs ファイルには、 private の依存関係を追加するための行があります。
PrivateDependencyModuleNames.AddRange(new string[] { });
その行に、 SlalteCore と Slate モジュールを追加します。
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
プロジェクトの作成時期とエンジンのバージョンによって、 *.build.cs ファイルに既にスレートの依存関係が設定されていても、コメントアウトされている場合があります。該当する行のコメントを解除すれば 依存関係を設定することができます。
// Uncomment if you are using Slate UI (スレート UI を使用している場合はコメント行を外します) // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
ウィジェットの表示
ゲーム内にスレッド ウィジェットを表示するために、ゲームのビューポートに追加しなければなりません。オーバーレイされたウィジェットは、追加時に指定された Z オーダーに従って、Z オーダーの値が大きいものが Z オーダーの小さい値の上に表示されます。
ゲーム ビューポートへアクセスする
ゲームのビューポートは、GameViewportClient
のインスタンスです。UEngine
のUEngine
メンバを使用して、現在のゲーム ビューポートへの参照にアクセスできます。これには、ゲームの現在の UEngine
インスタンスへの GEngine
グローバル ポインタを使用してアクセスできます。
例:
GEngine->GameViewport
GEngine
と GameViewport
は NULL
にできるので、
メンバーを含めてアクセス前に必ず値を確認してください。
ウィジェットをビューポートに追加する
スレート ウィジェットは、参照 (TSharedref<SWidget>
) を
GameViewportClient::AddViewportWidgetContent()
のウィジェットへパスすると、ビューポートへ追加されます。この関数はウィジェットと Z 順序の両方を受け取ると、
前述したとおり、新規ウィジェットのソート順序を決定します。Z 順序は任意ですが、
デフォルトの値は 0
です。
ビューポートに追加するウィジェットへの参照は、HUD などのクラスのメンバとして保存するか、作成して関数の呼び出し時に渡すことができます。
メンバ変数に格納されているウィジェットへ参照をパス (TSharedPtr
として):
GEngine->GameViewport->AddViewportWidgetContent(
SNew(MyWidgetPtr.ToSharedRef())
);
GameViewportClient::AddViewportWidgetContent()
をパスする時に、 SNew()
を使ってウィジェットを作成:
GEngine->GameViewport->AddViewportWidgetContent(
SNew(SWeakWidget)
.PossiblyNullContent(MyWidgetClass)
);
あるいは、SAssignNew()
を使って作成し、TSharedPtr
メンバを割り当て、以下にパス:
GEngine->GameViewport->AddViewportWidgetContent(
SAssignNew(MyWidgetPtr, SWeakWidget)
.PossiblyNullContent(MyWidgetClass)
);
ビューポートからウィジェットを取り除く
以前につ追加したウィジェットへの参照を GameViewportClient::RemoveViewportWidgetContent()
に渡すことで、
ビューポートからスレート ウィジェットを個別に削除することができます。
例:
GEngine->GameViewport->RemoveViewportWidgetContent(
SNew(MyWidgetPtr.ToSharedRef())
);
さらに、すべてのウィジェットは GameViewportClient::RemoveAllViewportWidgets()
を呼び出すと、 1 度にビューポートから取り除くことができます。
例:
GEngine->GameViewport->RemoveAllViewportWidgets();
GEngine
と GameViewport
は NULL
にできるので、
メンバーを含めてアクセス前に必ず値を確認してください。