ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UEFN】〈Tips〉基礎からデバイスやVerseでシーケンサーの制御をしてみよう

目次

 

はじめに

この記事ではUEFNで多く多用されるシーケンスの制御をデバイスとVerseの両方で行う解説をします。ぜひ参考になれば幸いです。

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

また、Verseでは非同期処理でより良いコードが書けますが、直感的にわかりやすいSubscribe方式で書いています。

非同期処理の場合でしたらこちらに素晴らしい記事がありますので、ぜひ参考にしていただきたいです!

qiita.com


本記事は以下の記事を参考にしています。

dev.epicgames.com

dev.epicgames.com

 

環境

UEFN5.4

解説

直観的に理解できるようにデバイスでの手法を紹介した後にVerseで同様の処理記述例を紹介します。

共通

①デバイスの用意

UEFNのデバイスから以下を選びます。


ボタン ×2
CinematicSequence ×1

 

マップに配置します。

アウトライナー上でPlayボタンとPauseボタンという名前に変更しました。

②シーケンスの用意

シーケンスアセットを作成します。

 

適当なモデルを配置します。

シーケンサーに登録してキーを打ってアニメーション付けます。
わかりやすく、位置を変更するものにしました。

 

③シーケンスの登録

配置したCinematicSequenceしかけにシーケンスの登録をします。

バイスでのやり方

①イベントの登録

CinematicSequenceしかけを選択して以下のように設定します。

※スポイトボタンで画面上のボタンを選択するのが便利!

 

再生機能にPlayボタンのOnInteract
一時停止機能にPauseボタンのOnInteract

 

②実行と確認

セッションを開始して実際にシーケンスの再生と一時停止を確認できたら完了です。



Verseでのやり方

バイスでやっていたことをVerseというコード形式のプログラミングで同様のことを行ってみましょう。

①Verseの新規作成

ウィンドウからVerse Explorerを開き、任意のフォルダからVerseファイルを追加します。

名前をsequence_controllerとしました。

作成ボタンを押します。


追加されたVerseコードをダブルクリックするとVSCodeが開きます。

 

②コードの編集


以下のコードを記載します。
VerseはC#C++とは異なり、改行によりコードブロックを識別している言語です。
そのため、改行の問題によりエラーが出ることがあります。半角スペースで改行に問題がないかをよく確認しましょう。

コードの解説は最後に行います。

記載が完了したらCtrl + S で保存します。

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


# A Verse-authored creative device that can be placed in a level
sequence_controller := class(creative_device):

    # 再生ボタンデバイス
    @editable
    PlayButton : button_device = button_device{}

    # 一時停止ボタンデバイス
    @editable
    PauseButton : button_device = button_device{}

    # CinematicSequenceデバイス
    @editable
    CinematicSequence : cinematic_sequence_device = cinematic_sequence_device{}

 
    # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=

        # インタラクトしたときに関数を呼ぶように登録する
        PlayButton.InteractedWithEvent.Subscribe(OnPlaySequence)
        PauseButton.InteractedWithEvent.Subscribe(OnPauseSequence)

    # シーケンスを再生する関数
    OnPlaySequence(Agent:agent):void=
        CinematicSequence.Play()

    # シーケンスを一時停止する関数
    OnPauseSequence(Agent:agent):void=
        CinematicSequence.Pause()

UEFNに戻り、Verseコードのビルドを行います。

 

③VerseDeviceの配置と登録

コンテンツブラウザにあるsequence controllerをマップに配置します。

詳細から@editableで定義した変数にデバイスを登録していきます。

バイスでイベントを登録している人はVerseでの動作を確認できないので
登録を削除しておきましょう。

④実行と確認

セッションを開始して実際にシーケンスの再生と一時停止を確認できたら完了です。

 

⑤コード解説

@editable はVerseで定義した変数をエディタに公開する場合に利用します。
今回はマップに配置しているスイッチとシーケンス再生デバイスを参照するのに利用しています。

    # 再生ボタンデバイス
    @editable
    PlayButton : button_device = button_device{}

    # 一時停止ボタンデバイス
    @editable
    PauseButton : button_device = button_device{}

    # CinematicSequenceデバイス
    @editable
    CinematicSequence : cinematic_sequence_device = cinematic_sequence_device{}


OnPlaySequenceとOnPauseSequenceは独自に作成した関数です。
コメントにもあるようにCinematicSequenceの再生と一時停止を行っています。

  # シーケンサーを再生する関数
    OnPlaySequence(Agent:agent):void=
        CinematicSequence.Play()

    # シーケンサーを一時停止する関数
    OnPauseSequence(Agent:agent):void=
        CinematicSequence.Pause()

cinematic_sequence_deviceで制御できる機能はVerseの定義を見てみたり、公式のドキュメントを見てみましょう。

dev.epicgames.com

ボタン一つで切り替える場合はこの関数を利用できそう~みたいな気付きがあるのでお勧めです。

 


Verseで元から用意されているOnBeginはゲーム開始時に呼ばれるイベントです。
ここでは、ボタンを押したときのイベントと独自で作成した関数を紐づけする登録作業をしています。

    OnBegin<override>()<suspends>:void=

        # インタラクトしたときに関数を呼ぶように登録する
        PlayButton.InteractedWithEvent.Subscribe(OnPlaySequence)
        PauseButton.InteractedWithEvent.Subscribe(OnPauseSequence)

 

Verseのメリット

ここまで解説でVerseを使うメリットがないと思われるかもしれませんが、Verseを使うメリットをいくつか紹介します。

①遅延処理

バイスではタイマー系の仕掛けを使わないといけない遅延処理などはSleep(時間)で遅延させることができます。

    OnBegin<override>()<suspends>:void=
       
        # シーケンサーを再生
        CinematicSequence.Play()
 
        # 10秒待機
        Sleep(10.0)
 
        # シーケンサーを再生
        CinematicSequence.Play()

 

②シーケンスの再生位置の指定

現状、マテリアルパラメータコレクションをVerseから直接制御することができません。
そのため、あらかじめシーケンスに焼きこんで、シーケンスの時間を制御することで間接的にマテリアルパラメータコレクションを制御する方法があります。

そのような場合ではこのようなコードを書くとよいでしょう。

    OnBegin<override>()<suspends>:void=
       
        # 1秒の時のシーケンスを設定
        CinematicSequence.SetPlaybackTime(1.0)
        # 再生して止める
        CinematicSequence.Play()
        CinematicSequence.Pause()

        # 5秒待機
        Sleep(5.0)
       
# 60フレームの時のシーケンスを再生
        CinematicSequence.SetPlaybackFrame(60)
        # 再生して止める
        CinematicSequence.Play()
        CinematicSequence.Pause()
       

シーケンスの再生フレーム/時間の確認には時刻表示の選択でできます。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる