［UE5］アスペクト比が一定になるウィジェットを作成する

# 概要
Unreal Engine 5で、ウィジェット（Widget）をゲームプレイ画面に追加し、ゲームプレイ画面のサイズを変更した際に、下の動画のように配置しているウィジェットの位置がずれたり、サイズが変わらなかったりしていると思います。

<iframe width="640" height="360" src="https://www.youtube.com/embed/a_sSyQerFoU" title="widget 1 1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br>

この記事では、下の動画のように、ゲームプレイ画面のサイズを変更した際に、一定のアスペクト比を保ち、ゲームプレイ画面サイズに合わせたサイズになるウィジェットを作成します。

<iframe width="640" height="360" src="https://www.youtube.com/embed/byNupo4xnBg" title="widget 1 2" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


# この記事の主な対象者
- Widget Blueprint（WBP）の作り方の基礎を習得されている、初心者の方


# 1. ゲームプレイ画面サイズに合わせて、ウィジェットのサイズが変わるようにする

最初に、ウィジェットブループリントを作成し、下図のように「Scale Box」ウィジェットを追加します。

![scalebox.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/55ce4696-cc97-b5d8-4ee8-8bf2ff26c553.jpeg)

「Scale Box」ウィジェットを使用することにより、「Scale Box」の子ウィジェットは、スケールボックスのサイズに合わせてスケーリングされるようになります。

つまり、「Scale Box」ウィジェットを使用することで、**ゲームプレイ画面のアスペクト比が変わっても、画面サイズに合わせてウィジェットのサイズが変わる**ようになります。<br><br>


画面サイズに合わせてウィジェットのサイズが変わってくれるようになったのならば、これで完成なのでは？と思った方もいらっしゃると思いますが、この状態だと問題があります。

実はこの状態だと、子ウィジェットに「Canvas Panel」ウィジェットを設定しても、**ゲームプレイ画面に表示するウィジェットのアスペクト比は、 1 : 1 にしかできません**。<br><br>

「Scale Box」ウィジェットの子ウィジェットとして、何かウィジェットを追加してみるとわかると思うのですが、下図のように、「Scale Box」ウィジェットの下には、アスペクト比が1:1の状態でウィジェットが入ってしまいます。

![canvasratio_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/3704b5c7-0995-75c0-f937-92323c40b22c.jpeg)

（上図では、視覚的にアスペクト比を確認しやすくするために、「Canvas Panel」ウィジェットと同じサイズの、白色の「Image」ウィジェットを追加しています。）<br><br>

この状態だと、下図のような構成のウィジェットを作ると、下の動画のような挙動になってしまいます。

![canvasratio_11_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/b360e2e1-d037-1872-b5c4-d7f5404c3abe.jpeg)

<iframe width="640" height="360" src="https://www.youtube.com/embed/mDe96j6sDX4" title="widget 1 3" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br>

上の動画から、サイズ調整対象となるのが、アスペクト比が1:1の子ウィジェット内だけとなっているのがわかります。


そのため、次はアスペクト比を指定した比率に保つことができるようにしていきます。



# 2. ウィジェットのアスペクト比を指定した比率で保てるようにする

アスペクト比を指定したした比率で保てるようにするために、先ほど追加した「Scale Box」ウィジェットの子ウィジェットとして「Size Box」ウィジェットを追加します。

![sizebox.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/af5f75a2-e1d3-33ca-5608-5b193a30da4b.jpeg)

「Size Box」ウィジェットを使用することにより、**「Size Box」の子ウィジェットを指定したサイズで保つことができる**ようになります。<br><br>


「Scale Box」ウィジェットの子ウィジェットとして「Size Box」ウィジェットを追加したら、追加した「Size Box」ウィジェットを選択し、詳細パネルを開きます。

詳細パネルの「チャイルド レイアウト」＞「Width Override」と、「チャイルド レイアウト」＞「Height Override」の項目にチェックを入れ、設定したい画面のサイズを入れます。

![childlayout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/42575dc0-6d2a-9ea4-0cc4-fae93a8d1260.jpeg)

この記事では、ウィジェットの画面全体を利用できるようにしたいため、この記事で作成しているウィジェットの1番上の階層のウィジェットである「Scale Box」ウィジェットのサイズを「チャイルド レイアウト」＞「Width Override」と「チャイルド レイアウト」＞「Height Override」に設定します。

ウィジェットのサイズを確認するには、確認したいウィジェット（この記事では「Scale Box」ウィジェット）を選択し、ウィジェットのサイズを確認してから、「チャイルド レイアウト」＞「Width Override」と「チャイルド レイアウト」＞「Height Override」に値を設定します。

選択しているウィジェットのサイズは、下図の赤丸の場所から確認することができます。

![scalebox_size.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/95f04da3-fd46-df11-c0a3-f54eafa2bf3f.jpeg)<br><br>


「Size Box」に保つ画面サイズを設定したら、「Size Box」の子ウィジェットとして「Canvas Panel」ウィジェットを追加します。その後、「Canvas Panel」ウィジェットの下に、適当なウィジェットを配置してみます。（この記事では、動作確認用に下図のようにウィジェットを追加します。）

![widget_finished.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/c92ae9f0-b3df-c983-f89f-8301fa013c8c.jpeg)<br><br>

ゲームプレイ画面のサイズを変更しても、「Canvas Panel」の子ウィジェットが一定のアスペクト比を保ち、ゲームプレイ画面サイズに合わせたサイズになっているかを確認します。

<iframe width="640" height="360" src="https://www.youtube.com/embed/HVRliDEABEY" title="widget 1 4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br>


上の動画からわかるように、この時点で一定のアスペクト比を保ち、ゲームプレイ画面サイズに合わせたサイズになるようにはできましたが、ゲームプレイ画面にウィジェットのアスペクト比を保つことで生まれた空間に、背景が映ってしまっています。

このようになる理由は、**ゲームプレイ画面を映している、カメラの画面のアスペクト比が可変になっているから**です。

そのため、次はゲームプレイ画面を映している、カメラの画面のアスペクト比を一定にします。


# 3. ゲームプレイ画面のアスペクト比を一定にする

最初に、ゲームプレイ画面を映しているカメラを保持しているアクタのBlueprintを開きます。

次に、ゲームプレイ画面を映しているカメラのコンポーネントを選択し、詳細パネルを開きます。

詳細パネルの「カメラセッティング」＞「Constrain Aspect Ratio」にチェックを入れることで、カメラの画面のアスペクト比を一定にすることができます（下図の赤丸）。

その後、詳細パネルの「カメラセッティング」＞「Aspect Ratio」に、（横の比率 ÷ 縦の比率）の値を設定します。（この記事では、ウィジェットのアスペクト比を 16 : 9 にしているので、16 ÷ 9 = 1.7777777… を設定します（下図の緑線）。）

![camera_aspectratio.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/629ada56-5bba-869c-7dd9-1898fce51e7c.jpeg)

ゲームプレイをし、ゲームプレイ画面に映っている画面が、指定したアスペクト比の部分のみ映るようになっているか確認します。

<iframe width="640" height="360" src="https://www.youtube.com/embed/k_tPZ8zitk0" title="widget 1 5" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br>


ゲームプレイ画面に映っている画面が、指定したアスペクト比の部分のみ映るようになっていることを確認したら、作成したウィジェットをゲームプレイ画面に映すようにし、下の動画のようになっているか確認します。

<iframe width="640" height="360" src="https://www.youtube.com/embed/byNupo4xnBg" title="widget 1 2" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br>


以上で完成です。

あとは、ウィジェットの「Canvas Panel」ウィジェット以下の階層に、好きなウィジェットを入れて、アスペクト比を一定に保つオリジナルのウィジェットを作成しましょう。<br><br>

最後まで読んでいただき、ありがとうございました。