UEFN Verse言語 メタバース

【UEFN】UIボタンの作り方(2ページ目)│Verse解説の続き

【UEFN】UIボタンの作り方(2ページ目)│Verse解説の続き
みなみ

Verse解説の続きを教えてほしいです!

りゅう

初心者向けにわかりやすく解説してほしいですね!

こんなお悩みを解決します。

 本記事の内容
 本記事の信頼性

この記事を書いている僕は、クリエイター兼ブロガーです。実際に現在進行形でUEFNを学んでいます。

今回は、UIボタンの作り方のVerse(2)について解説します。

なお、1を見ていない方は先に1から進めましょう。

>> UIボタンの作り方

【UEFN】UIボタンの作り方を画像付きで徹底解説【Verse言語】
【UEFN】UIボタンの作り方を画像付きで徹底解説【Verse言語】

続きを見る

※以下のコードの解説文は、プログラミング初心者の主が調べながら記述したものです。

コードの解釈に誤りがありましたら恐縮ですm(_ _)m

参考程度にどうぞ。

それでは、さっそくやっていきましょう。

あすか

UIボタンの作り方(2ページ目)│Verse解説の続き

(Agent : agent).SaveEnabledState(State : logic):void=の詳細

    # ボタンが現在有効な状態を保存します
    (Agent : agent).SaveEnabledState(State : logic):void=
        if(CurrentState := EnabledStateMap[Agent]):
            if(set EnabledStateMap[Agent] = State){}
        else:
            set EnabledStateMap = ConcatenateMaps(EnabledStateMap, map{Agent => State})

【重要】(Agent : agent).SaveEnabledState(State : logic):void=のまとめ

if(set EnabledStateMap[Agent] = State){}でset CurrentState を使わない理由

if(set EnabledStateMap[Agent] = State){}についての詳細

マップの要素を追加、変更することについて

set EnabledStateMap = ConcatenateMaps(EnabledStateMap, map{Agent => State})の詳細

マップ(連想配列)を作成する式map{Agent => State}について

「要素」と「値」の違い

set EnabledStateMap = ConcatenateMaps(EnabledStateMap, map{Agent => State})はEnabledStateMapが空である場合に実行される

EnabledStateMap[Agent]をCurrentState に代入する必要性&条件式を使う理由

ConcatenateMaps関数を使用してマップを結合する理由

if(set EnabledStateMap[Agent] = State){}がスキップされる条件

if(set EnabledStateMap[Agent] = State){}がスキップされる条件:エージェントの有効状態の更新の詳細

if(set EnabledStateMap[Agent] = State){}がスキップされる条件:else ブロックの条件

set EnabledStateMap[Agent] = Stateの論理

CurrentState に代入する意味

【重要】EnabledStateMap の値を設定する際に括弧 {}を使用している理由

確認と保険のための条件式*2

if(CurrentState := EnabledStateMap[Agent]):部分の目的

set EnabledStateMap = ConcatenateMaps(EnabledStateMap, map{Agent => State})の詳細

ShowWidget(Agent : ?agent):void=の詳細

    ShowWidget(Agent : ?agent):void=
        if(ValidAgent := Agent?, ThisButtonWidget := ButtonWidgetPerPlayer[ValidAgent]):
            ThisButtonWidget.SetVisibility(widget_visibility.Visible)
            if(SaveButtonState?):
                ValidAgent.SaveVisibleState(true)

ButtonWidgetPerPlayer[ValidAgent]):のValidAgentに関連する値とは

SetVisibility関数の詳細

if(SaveButtonState?):~クエリ式の詳細

HideWidget(Agent : ?agent):void=の詳細

    # Completely removes the button ui
    HideWidget(Agent : ?agent):void=
        if(ValidAgent := Agent?, ThisButtonWidget := ButtonWidgetPerPlayer[ValidAgent]):
            ThisButtonWidget.SetVisibility(widget_visibility.Collapsed)
            if(SaveButtonState?):
                ValidAgent.SaveVisibleState(false)

SetVisibilityの詳細

(Agent : agent).SaveVisibleState(State : logic):void=の詳細

    # Saves the visible state the button is currently in
    (Agent : agent).SaveVisibleState(State : logic):void=
        if(CurrentState := VisibleStateMap[Agent]):
            if(set VisibleStateMap[Agent] = State){}
        else:
            set VisibleStateMap = ConcatenateMaps(VisibleStateMap, map{Agent => State})

SaveVisibleStateとVisibleStateMapの関係性

Stateの意味

SetEnabled関数の詳細

ButtonPosition,sizeのVector2についての詳細

ButtonUI_UserOptions_Functionsクラスについて

ButtonUI_UserOptions_Functions := class<concrete>():

    # このuiボタンを有効にするトリガー
    @editable EnableButtonOnTrigger : trigger_device = trigger_device{}

    # このuiボタンを無効にするトリガー
    @editable DisableButtonOnTrigger : trigger_device = trigger_device{}

    # このuiボタンを表示するトリガー
    @editable ShowButtonOnTrigger : trigger_device = trigger_device{}

    # このuiボタンを非表示にするトリガー
    @editable HideButtonOnTrigger : trigger_device = trigger_device{}

ButtonUI_UserOptions_Eventsクラスについて

ButtonUI_UserOptions_Events := class<concrete>():

    # 起動するトリガー/送り先
    @editable TriggerToActivate : trigger_device  = trigger_device{}

    # UI ボタンのインスティゲーターは送信しますか?
    @editable SendInstigator : logic = true

    # インスティゲーターとは、あるイベントを引き起こした原因となるオブジェクトや人物です。
    # この場合、UI ボタンをクリックしたユーザーがインスティゲーターとなります。
    # SendInstigator は、UI ボタンをクリックしたユーザーを送信するかどうかを指定します。
    # SendInstigator が true の場合、UI ボタンをクリックしたユーザーが送信されます。
    # SendInstigator が false の場合、UI ボタンをクリックしたユーザーは送信されません。

trigger_deviceクラスについて

ボタンやUIの初期化、およびイベントの購読(Subscribe)

▼ このコードは、特定のイベントが発生したときにUIを表示し、ボタンに関数を割り当てる処理を行う関数の定義です。

    OnBegin<override>()<suspends>:void=
        InitButtonFunctions()
        TriggerToShowUI.TriggeredEvent.Subscribe(OpenUI)

InitButtonFunctions()の詳細

    # 各ボタンの「functions」タブを初期化します。
    InitButtonFunctions():void=
        for(ThisButtonUI : ButtonUI):
            ThisButtonUI.ButtonSignal_Recieve.EnableButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.EnableWidget) 
            ThisButtonUI.ButtonSignal_Recieve.DisableButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.DisableWidget) 
            ThisButtonUI.ButtonSignal_Recieve.ShowButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.ShowWidget)
            ThisButtonUI.ButtonSignal_Recieve.HideButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.HideWidget)

ThisButtonUIがButtonUI型であることの詳細

for(ThisButtonUI : ButtonUI):の詳細

ThisButtonUI.ButtonSignal_Recieve.EnableButtonOnTrigger~の詳細

        ThisButtonUI.ButtonSignal_Recieve.EnableButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.EnableWidget)
        ThisButtonUI.ButtonSignal_Recieve.DisableButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.DisableWidget)
        ThisButtonUI.ButtonSignal_Recieve.ShowButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.ShowWidget)
        ThisButtonUI.ButtonSignal_Recieve.HideButtonOnTrigger.TriggeredEvent.Subscribe(ThisButtonUI.HideWidget)

ButtonSignal_Recieveの定義

@editable 
ButtonSignal_Recieve : ButtonUI_UserOptions_Functions = ButtonUI_UserOptions_Functions{}

Subscribe関数の詳細

OpenUI(Agent : ?agent):void=~の詳細

    OpenUI(Agent : ?agent):void=
        if(ValidAgent := Agent?, Player := player[ValidAgent], PlayerUI := GetPlayerUI[Player]):
            if(MyUI := MaybeMyUIPerPlayer[Player]?):
                PlayerUI.RemoveWidget(MyUI)
                if(set MaybeMyUIPerPlayer[Player] = false) {}
            else:
                NewUI := CreateMyUI(ValidAgent)
                PlayerUI.AddWidget(NewUI, player_ui_slot{InputMode := ui_input_mode.All})
                if(set MaybeMyUIPerPlayer[Player] = option{NewUI}) {}

AddWidget関数の詳細

player_ui_slot構造体の詳細

player_uiクラスとplayer_ui_slot構造体の関係性

「エージェントが有効」の意味

PlayerUI := GetPlayerUI[Player]の詳細

GetPlayerUI関数の詳細

player_uiクラスの詳細

MaybeMyUIPerPlayer文を記述する目的

if(MyUI := MaybeMyUIPerPlayer[Player]?):の詳細

set MaybeMyUIPerPlayer[Player] = falseの目的

要素にアクセスするための「?」

PlayerUI.RemoveWidget(MyUI)とif(set MaybeMyUIPerPlayer[Player] = false) {}:の目的の違い

if(MyUI := MaybeMyUIPerPlayer[Player]?):のMaybeMyUIPerPlayerに[Player]とつけて呼び出す理由

PlayerUI.RemoveWidget(MyUI)の詳細

RemoveWidget関数の詳細

if(set MaybeMyUIPerPlayer[Player] = false) {}の詳細

else~NewUI := CreateMyUI(ValidAgent)の詳細

PlayerUI.AddWidget(NewUI~er[Player] = option{NewUI}) {}の詳細│CreateMyUIの定義(含)

AddWidgetの詳細

player_ui_slotの詳細

ui_input_mode列挙型の詳細

PlayerUI.AddWidget(NewUI, player_ui_slot{InputMode := ui_input_mode.All})を記述する理由

if(set MaybeMyUIPerPlayer[Player] = option{NewUI}) {}の詳細

optionを使用している理由

まとめ

今回はVerse解説の続き(2)について解説しました。

本日もお疲れさまでした🍵

がんばった!!!

 僕のTwitterアカウントです。
 Next→
【UEFN】UIボタンの作り方(3ページ目)│Verse解説の続き
【UEFN】UIボタンの作り方(3ページ目)│Verse解説の続き

続きを見る

【UEFN】UIボタンの作り方(4ページ目)│Verse解説の続き
【UEFN】UIボタンの作り方(4ページ目)│Verse解説の続き

続きを見る

【UEFN】UIボタンの作り方(5ページ目)│Verse解説の続き
【UEFN】UIボタンの作り方(5ページ目)│Verse解説の続き

続きを見る

  • この記事を書いた人
  • 最新記事

あすか(Asuka)

自己紹介:UEFNクリエイター
Verse言語独学中 | UE・プログラミング・3Dモデリング 6月開始 | 備忘録として学習記録をブログに残しています。
■好きな言葉
徳は弧ならず必ず隣あり.
■ひとこと
まだまだ未熟者ですが、
よろしくお願いします。

-UEFN, Verse言語, メタバース
-, ,