【UEFN】BGMやSEなどのサウンドをVerseで操ってみる

## 背景
ゲームの要素として重要なものの一つとしてBGMやSEがあります。それらを柔軟に扱ってみたかったので今回調べ始めました。

## 音声素材をインポートする方法
> UEFN には .wav、.slac、.ogg、または .aif 形式のオーディオ ファイルをインポートできます。このエディタでは、これらのファイルを認識して直接使用できます。また、それらを サウンド キュー として保存することで、追加の機能を利用することもできます。

上記の形式に沿ったオーディオファイルをコンテンツドロワーにインポートorドラッグアンドドロップすると`サウンドウェーブファイル`ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/7accb907-a511-3b9f-fc08-b24303b79b94.png)
この形式のままでも良いのですがもっとサウンドに編集を加えたいときが来ると思うのでこのファイルを右クリックして`キューを作成`をするのがよいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/fbdfc576-9440-c5a0-3f76-9bda588d563f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/27bfed92-3caa-da00-48f7-2f287a3ae8e2.png)
キューファイルをダブルクリックすると以下のようなノード画面が開きます。ここで様々な事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/8da8f1f0-5282-43f6-842d-abf94a60badd.png)

### BGM素材について
ループにチェックを入れておくと無限に流れるようにできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/9c5842f9-b1f7-2da8-f71e-92ac6ea4a069.png)


## Verseでサウンドを鳴らしてみる
### 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/diHPHSQO9ZE?si=LFRVoOWiEunQgZvG" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### 利用するDevice
オーディオプレイヤー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/9d8e15ff-ad97-5484-ce51-a9a4417412e2.png)
切り替えるスイッチ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/515a2429-a695-e1aa-0d98-6a337c5afcb6.png)

### 配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/7f3139f7-f605-027a-1ce9-d40ee3b3c01e.png)

### 全体コード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sound_manager_device := class(creative_device):

    @editable
    bgm1_player:audio_player_device=audio_player_device{}

    @editable
    bgm2_player:audio_player_device=audio_player_device{}

    @editable
    se_player:audio_player_device=audio_player_device{}

    @editable
    bgm_player_switch:switch_device=switch_device{}

    @editable
    bgm_change_switch:switch_device=switch_device{}

    @editable
    se_player_switch:switch_device=switch_device{}

    var is_play_bgm : logic = false
    var bgm_order : int = 0

    OnBegin<override>()<suspends>:void=
        bgm_player_switch.StateChangesEvent.Subscribe(PlayAndStopBGM)
        bgm_change_switch.StateChangesEvent.Subscribe(ChangeBGM)
        se_player_switch.TurnedOnEvent.Subscribe(PlaySE)

    PlayAndStopBGM():void=
        if (bgm_order = 0, is_play_bgm = false):
            set is_play_bgm = true
            bgm1_player.Play()
            bgm2_player.Stop()
        else if (bgm_order = 1, is_play_bgm = false):
            set is_play_bgm = true
            bgm2_player.Play()
            bgm1_player.Stop()
        else if (is_play_bgm = true):
            set is_play_bgm = false
            bgm1_player.Stop()
            bgm2_player.Stop()

    ChangeBGM():void=
        if (bgm_order = 0):
            set bgm_order = 1
        else if (bgm_order = 1):
            set bgm_order = 0

    PlaySE(Agent:agent):void=
        se_player.Play(Agent)
```
プレイヤーを指定してPlay関数を呼ぶだけで音が鳴り始めるようです！
```
    bgm1_player.Play()
    bgm2_player.Stop()
```
Play関数の引数にagentを入れるだけでそのagentと紐づいているプレイヤーのみに向けて音を鳴らせます。
```
    se_player.Play(Agent)
```
## まとめ
サウンドキューをVerseで保持できるようになればトランジションなどのBGM切り替えが簡単にできそうだなぁと感じましたｗ
サウンド関連のデバイスは思った以上に多くてもっと深ぼっていきたいと思いました。
↓これをちょっと使いこなしたい。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/c1e55be1-bb83-a82a-77dc-625469f0242d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/78d29922-f555-73eb-2cb1-68e212843029.png)

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

https://discord.gg/cK4daQyD