【UEFN】Verseでスコアマネージャーを触ってみる

## 背景
UEFNでなにかゲームを作り始めようと考えていた時に何かスコアを使って他のプレイヤーと競争ができるようなものが作ろうと思っていました。当時はVerseに触れておらずGUI上で設定しなければならずまた、様々なデバイスを絡めてやらないといけないというところで手につけることができませんでした。
最近Verseを書いていて使い方のイメージが付いたので書き記していきたいと思います。

## score_manager_deviceクラスでできること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/e9803600-eee1-0018-85b6-7a6a017edac9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/0f8b13c0-9398-88fd-7992-3e55d16f03fa.png)

- トリガーが最大回数押されたときにシグナルを受け取る
- スコアが追加されたときにシグナルを受け取る（プレイヤーごとにできる）
- アクティブ非アクティブに切り替える
- スコアの状態をリセットに戻す（プレイヤーごとにできる）
- スコアを獲得させる
- もらえるスコアの量を1増やす（プレイヤーごとにできる）
- もらえるスコアの量を1減らす（プレイヤーごとにできる）
- もらえるスコアの量を数字を指定して変更する（プレイヤーごとにできる）
- 現在貰えるスコアの量をスコアに追加する
- 現在のスコアを取得（プレイヤーごとにできる）

## 実装してみる
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

score_trigger_device := class(creative_device):

    @editable
    Trigger:trigger_device=trigger_device{}
    @editable
    ScoreManager:score_manager_device=score_manager_device{}
    @editable
    ScoreText:billboard_device=billboard_device{}
    @editable
    EventText:int=10

    ScoreMessage<localizes>(msg:string):message="{msg}"

    OnBegin<override>()<suspends>:void=
        SetTriggerText(0)
        # トリガーの最大回数を指定して変更する
        Trigger.SetMaxTriggerCount(10)
        # もらえるスコアの量を数字を指定して変更する
        ScoreManager.SetScoreAward(10)
        Trigger.TriggeredEvent.Subscribe(OnIncrementTrigger)
        # スコアが追加されたときにシグナルを受け取る
        ScoreManager.ScoreOutputEvent.Subscribe(OnScoreOutput)
        # トリガーが最大回数押されたときにシグナルを受け取る
        ScoreManager.MaxTriggersEvent.Subscribe(OnMaxTriggers)
    
    OnIncrementTrigger(QAgent:?agent):void=
        if (Agnet:=QAgent?):
            # 現在貰えるスコアの量をスコアに追加する
            ScoreManager.Activate(Agnet)
            # もらえるスコアの量を1増やす
            ScoreManager.Increment(Agnet)
            SetTriggerText(ScoreManager.GetCurrentScore(Agnet))

    OnDecrementTrigger(QAgent:?agent):void=
        if (Agnet:=QAgent?):
            # 現在貰えるスコアの量をスコアに追加する
            ScoreManager.Activate(Agnet)
            # もらえるスコアの量を1減らす
            ScoreManager.Decrement(Agnet)
            # もらえるスコアの量を取得
            Award:=ScoreManager.GetScoreAward()
            Print("Award : {Award}")
            SetTriggerText(ScoreManager.GetCurrentScore(Agnet))
    
    OnScoreOutput(Agent:agent):void=
        Print("Score Output")

    OnMaxTriggers(QAgent:agent):void=
        Print("Max Triggers Reached")

    SetTriggerText(value:int):void=
        ScoreText.SetText(ScoreMessage("Now Socre : {value}"))

    OnEnableAndDisable():void=
        # スコアの追加を有効にする
        ScoreManager.Enable()
        # スコアの追加を無効にする
        ScoreManager.Disable()
```

プレイヤーごとに細かく設定できそうですね。

### トリガーが最大回数押されたときにシグナルを受け取るについて

```
        # トリガーの最大回数を指定して変更する
        Trigger.SetMaxTriggerCount(10)

        # トリガーが最大回数押されたときにシグナルを受け取る
        ScoreManager.MaxTriggersEvent.Subscribe(OnMaxTriggers)
```
トリガーの最大回数を上記のように指定して、指定した回数に達したときに`MaxTriggersEvent`が反応します。

## まとめ
UEFNによくあるタイクーンゲームもこのようにVerseで扱えれば簡単にできそうですよね。
個人的にスコアマネージャー関連はGUIで行うよりVerseで扱った方が使いやすいなと思いました。

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/cK4daQyD