概要
UnrealEngine5 にて円型のプログレスバーを作ってみたメモです。
更新履歴
日付 | 内容 |
---|---|
2023/08/07 | 初版 |
参考
以下の記事を参考にいたしました、ありがとうございます。
UE公式:UMG UIデザイナ
UE公式:グラディエント(勾配) マテリアル関数
UE公式:Math マテリアル関数
Round / Radial Progress Bar - Unreal Engine 5 Tutorial [UE5]
[UE4]マテリアル表現の幅が広がる!おもしろいノード&マテリアル関数集 1
環境
Windows10
Visual Studio 2022
UnrealEngine 5.1.1
マテリアル準備
アセット作成
コンテンツブラウザからマテリアルを作成、名前を付けます。
次にマテリアルアセットを開いて詳細から[マテリアル]->[Material Domain] を User Interface
に、[Blend Mode]を Translucent
にします。
円をつくる
テクスチャを使わずに円をつくるには Radial Gradient Exponential
を利用します。これを使うと放射状のグラディエントが生成されます。
この円を大きさ違いで2つ用意し、差分を計算すると円型の出力が得られます。
Subtract
が差分の計算、Thickness
が円の厚みで0.1をデフォルト値としてパラメータ変換で持っておきます。このパラメータは後にWidgetBP側で変更することができます。
進行度を表すためのマスクをつくる
まずはUV座標をVectorToRadialValue
を使ってラジアル座標(基準点を中心にした角度と距離の座標系)に変換します。そのままだと左上が中心になるので 0.5 を減算し、中央を基準点にします。
このままだと右が回転の0度となるため、Custom Rorator
で1/4(0.25)だけ回転させて上を0度となるようにします。
上記の結果を踏まえて、if
ノードにてマスクを作成します。Percent
は変数として外部から変更できるようにパラメータ化しておきます。このPercent が 0.5だと以下のようになり、上をスタートとして回転の半分だけ白部分となります。
白の部分が有効で黒の部分が無効になるマスクがつくられます。
円とマスクの合成
先の円とマスクをMultiply
にて掛け合わせると以下のような結果となります。
ウィジェットをつくる
マテリアルインスタンスの作成
カラーを BaseColor
としてパラメータ化し、以下のようにします。
マテリアルインスタンスからパラメータ化した値を変更することができます。(外部から変更するパラメータはチェックを入れる必要があります。)
ウィジェットの準備
コンテンツブラウザから[ユーザーインターフェース]->[ウィジェットブループリント]を選択し、ウィジェットアセットを作成します。
[デザイナー]タブからレイアウトを作成します。
SizeBox
を用意し、その下へimage
を置きます。
次に設定用関数を作成します。
[グラフ]タブからSetPercent
関数を作成し、Create Dynamic Material Instance
でダイナミックマテリアルインスタンスを作成します。作成したダイナミックマテリアルインスタンスは変数として保持します。次にSet Brash from Material
でイメージを設定し、Set Scalar Parameter Value
でマテリアル変数のPercent
に対して値を入れるようにします。2回目以降は設定不要でSet Scalar Parameter Value
で値を入れることができるようにします。
ウィジェットを配置
配置されたウィジェットのSetPercent
関数を通じて値が入るように細工します。
追加機能
ゲージ分割
SectionNum
が分割数です。Vector To Radial Value
から取得した Vector Converted To Angle
とSin関数を掛けることで-1.0~+1.0までの変化を分割数分繰り返します。HoleWidth
は黒部分のサイズを決める値で、2倍して1を引くことで0~1への正規化を行っています。これを比較することで放射状のマスクを得ることができます。
グラデーション
以下のようなコードを追加し、出力カラーにいれます。
Vector To Radial Value
から取得した Vector Converted To Angle
を使って開始カラーBaseColor
と変更カラーToColor
を加算しています。IsGradation
はStaticBoolParameterとしてグラデーション機能のOn/Offに使用しています。
まとめ
UEのマテリアルはいろいろできていいですね。あとはきれいに書くことができれば。。