🌡️

【UEFN】Verseで進捗管理のできるプログレスバーを表示する

2023/10/30に公開

やりたいこと

決められた範囲でプレイヤーが進んだ距離に応じて進捗具合を表示できるプログレスバーを表示する。今回はX座標:0.0~10000.0の範囲で変化するように作成しています。

利用する装置

  • なし

コードの全体

  1. プログレスバーUIクラス
using { /Fortnite.com/Characters }
using { /Fortnite.com/UI }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /UnrealEngine.com/Temporary/UI }

CreateProgressBarUI<public><constructor>(InPlayer : player) := progress_bar :
    Player := option{player[InPlayer]}
    PlayerUI := option{GetPlayerUI[player[InPlayer]]}

progress_bar := class():
    
    var Canvas : canvas = canvas{}
    StartPostionX : float = 0.0
    EndPostionX : float = 10000.0
    Player : ?player = false
    PlayerUI : ?player_ui = false
    # プログレスバーのWidgetの初期化
    ProgressBar : slider_regular = slider_regular{DefaultValue := 0.0, DefaultMaxValue := 100.0, DefaultMinValue := 0.0}

    # プログレスバーのUIを作成します
    block:
        set Canvas = canvas :
            Slots := array :
                canvas_slot :
                    Anchors := anchors{Minimum := vector2{X := 0.5, Y:= 0.0}, Maximum := vector2{X := 0.5, Y := 0.0}}
                    Offsets := margin{Left := -700.0, Top := 70.0, Right := 1400.0, Bottom := 50.0}
                    SizeToContent := false
                    Alignment := vector2{X := 0.0, Y := 0.0}
                    Widget := ProgressBar
        
    InitUI<public>() : void =
        Print("AddProgressBar")
        if(InPlayerUI := PlayerUI?):
	    # プレイヤーにUIを追加します 
            InPlayerUI.AddWidget(Canvas)

    UpdateUI<public>(): void =
        if(InPlayer := Player?, Transform := InPlayer.GetFortCharacter[].GetTransform()):
	    # プレイヤーの座標から進捗具合を計算してます
            var CurrentTranslationX : float = Transform.Translation.X
            var ProgressValue : float = (CurrentTranslationX - StartPostionX) / (EndPostionX - StartPostionX) * 100
	    # プログレスバーに値をセットします。
            ProgressBar.SetValue(ProgressValue)
  1. メインクラス
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }

sample_01 := class(creative_device):

    # 各プレイヤーとプログレスバーのUIをmapで管理します
    var PlayerProgressBar : [player]?progress_bar = map{}
    
    OnBegin<override>()<suspends>:void=
        spawn{RegisterProgressBarUI()}

    RegisterProgressBarUI()<suspends>: void =
        loop:
            AllPlayer : []player = GetPlayspace().GetPlayers()
            for(Player : AllPlayer):
	        # 登録されてないプレイヤーにのみプログレスバーのUIを追加します
                if(not PlayerProgressBar[Player]):
		    # progress_barクラスのインスタンスを作成します
                    var ProgressBarUI : progress_bar = CreateProgressBarUI(Player)
		    # プレイヤーごとにprogress_barをmapに登録
                    if(set PlayerProgressBar[Player] = option{ProgressBarUI}):
                        # プレイヤーにプログレスバーのUIを追加します
			ProgressBarUI.InitUI()
			# プログレスバーの値を更新します
                        spawn{UpdateProgressBar(Player)}
	    Sleep(1.0)
    
    UpdateProgressBar(InPlayer: player)<suspends>: void =
        if(ProgressBarUI := PlayerProgressBar[InPlayer]?):
            loop:
                ProgressBarUI.UpdateUI()
                Sleep(0.1)

その他設定

なし

結果

プレイヤーがX軸方向に進むと0.0~10000.0の範囲でプログレスバーが更新されることが確認できました。

最後に

Only Upのようなゲームでも高度に合わせてプログレスバーを利用しどれだけ進んだかを表示することも可能です。利用方法はいろいろあると思いますのでslider_regularを利用してみてください。

Twitter(X)でも情報発信していくのでフォローしてね~
https://twitter.com/osoma_uefn

参考リンク

https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/ui/slider_regular
https://dev.epicgames.com/documentation/en-us/uefn/verse-api/unrealenginedotcom/temporary/ui/canvas

Discussion