[UEFN] ただリロードを見るだけの島 “I Love Reload” を公開

フォートナイトクリエイティブで、初の島を公開しました。

フォートナイトの銃のリロードをもっといろいろなアングルで眺めたいなぁ、という気持ちで作ったものです。

分らないことだらけで、できあがったものは簡単そうに見えるのに、実際の制作時間はえらく時間がかかりました。

目次

I Love Reload

下記の島コードでプレイすることができます。

島コード: 9683-5544-3032

https://twitter.com/20230820ABCDEFG/status/1700514142829068777?s=20

I Love Reload 2.0 [2023/10/01 公開]

初期バージョンは一人用として作っていましたが、最大4人までプレイできる複数人用にアップデートしました。

バージョン管理せずに作っていたので、メモ代わりとしてどういう風に作ったかここに記載しておきます。

島の設定

UEFN の島設定は下記のものです。

  • 最大プレイヤーを4人に設定
  • チームサイズを1人に設定(1人で1チーム)
  • チームインデックスを4に設定

仕掛けの設定

UEFN で下記の仕掛けを用意しました。

  • キャプチャーエリアの仕掛け
    ※リロード鑑賞用の場所に1つ設置
    ※カメラアングルを変更するトリガーとして使用します
  • ムービーシーケンスの仕掛けを4つ
    ※プレイヤーの人数分を用意
    ※カメラアングルを変更するシーケンスを各ムービーシーケンスの仕掛けに紐づけておきます
  • HUD制御の仕掛けを4つ
    ※プレイヤーの人数分を用意
    ※カメラアングルを変更している間は画面上のHUDを非表示にしたいので、色々なHUDを表示しないように設定しておきます

キャプチャーエリアの仕掛け

  • サイズなどいい感じに設定しておきます

ムービーシーケンスの仕掛け

  • ループ再生をONに設定
    ※ムービーシーケンスの仕掛けを再生中は、シーケンスで設定したカメラアングルを維持します
  • オートプレイはOFFに設定
    ※再生のタイミングはこちらで制御します
  • 視認性は「発信者のチーム」に設定
    ※島設定で1チームに1人としているので、実質プレイヤー1人だけが対象になります

HUD制御の仕掛け

  • 「影響を受けるチーム」を「チームインデックス」に設定
    ※チームインデックスの値は、HUD制御の仕掛けを4つにそれぞれ1~4を設定しておきます

Verse で制御していること

やっていることは下記のことです。

  • キャプチャーエリアに入ったプレイヤーのみ、HUDを非表示にする
  • キャプチャーエリアに入ったプレイヤーのみ、ムービーシーケンスを再生してプレイヤーの視点をシネマティックカメラからの視点にする
  • キャプチャーエリアから出たプレイヤーのHUDを表示する
  • キャプチャーエリアから出たプレイヤーのムービーシーケンスを停止して視点を通常に戻す

Verse のコード

コードを見たら、大体なにをやっているかはわかると思います。


using { /Fortnite.com/UI }
using { /Fortnite.com/Game }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /Fortnite.com/Teams }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }

# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.

# A Verse-authored creative device that can be placed in a level
player_camera_device := class(creative_device):
    # ムービーシーケンスの仕掛け
    # NOTE: 複数プレイヤーがいる場合、各プレイヤーそれぞれでムービーを再生するため、人数分の仕掛けを配列として受け取る
    @editable
    var SequenceDeviceAry:[]cinematic_sequence_device = array{}
    # キャプチャーエリアデバイスの仕掛け
    @editable
    CaptureAreaDevice : capture_area_device = capture_area_device{}
    # HUD制御の仕掛け
    # NOTE: 複数プレイヤーがいる場合、各プレイヤーそれぞれでHUDを非表示にしたいため、人数分の仕掛けを配列として受け取る
    @editable
    HudControllerDeviceAry: []hud_controller_device = array{}

    # 初期化
    InitFunc() : void =
        # 初期表示では、すべてのHUD制御の仕掛け(HUDを非表示にする設定済)を無効にする
        DisableAllHudController()
        # キャプチャーエリアに入った時のイベント登録
        CaptureAreaDevice.AgentEntersEvent.Subscribe(OnEnterCaptureArea)
        # キャプチャーエリアから出た時のイベント登録
        CaptureAreaDevice.AgentExitsEvent.Subscribe(OnExitCaptureArea)

    # キャプチャーエリアに入った時の処理
    OnEnterCaptureArea(PlayerAgent:agent) : void =
        # ムービーシーケンスを再生
        PlaySequenceDevice(PlayerAgent)
        # 画面上のUIを非表示
        HideHUD(PlayerAgent)

    # キャプチャーエリアから出た時の処理
    OnExitCaptureArea(PlayerAgent:agent) : void =
        # ムービーシーケンスを停止
        StopSequenceDevice(PlayerAgent)
        # 画面上のUIを表示
        ShowHUD(PlayerAgent)

    # ムービーシーケンスを停止
    StopSequenceDevice(PlayerAgent:agent) : void =
        # プレイヤーが属しているチームの index 番号を取得
        var TeamIndex:int = FindTeamIndex(PlayerAgent)
        if (0 <= TeamIndex):
            # index 番号と同じムービーシーケンスを停止する
            if (SequenceDevice := SequenceDeviceAry[TeamIndex]):
                SequenceDevice.Stop(PlayerAgent)

    # ムービーシーケンスを再生
    PlaySequenceDevice(PlayerAgent:agent) : void =
        # プレイヤーが属しているチームの index 番号を取得
        var TeamIndex:int = FindTeamIndex(PlayerAgent)
        if (0 <= TeamIndex):
            # index 番号と同じムービーシーケンスを再生する
            if (SequenceDevice := SequenceDeviceAry[TeamIndex]):
                SequenceDevice.Play(PlayerAgent)

    # HUD非表示
    HideHUD(PlayerAgent:agent) : void =
        # プレイヤーが属しているチームの index 番号を取得
        var TeamIndex:int = FindTeamIndex(PlayerAgent)
        if (0 <= TeamIndex):
            # index 番号と同じ HUD を有効化
            if (HudController := HudControllerDeviceAry[TeamIndex]):
                HudController.Enable()

    # HUD表示
    ShowHUD(PlayerAgent:agent) : void =
        # プレイヤーが属しているチームの index 番号を取得
        var TeamIndex:int = FindTeamIndex(PlayerAgent)
        if (0 <= TeamIndex):
            # index 番号と同じ HUD を無効化
            if (HudController := HudControllerDeviceAry[TeamIndex]):
                HudController.Disable()
            
    # チームの index 番号を取得して返す。取得できなかった場合は -1 を返す。
    FindTeamIndex(PlayerAgent:agent) : int =
        # プレイヤーが属しているチームを取得
        if (Team := GetPlayspace().GetTeamCollection().GetTeam[PlayerAgent]):
            # 全チーム取得
            AllTeamAry := GetPlayspace().GetTeamCollection().GetTeams()
            for (Index := 0..(AllTeamAry.Length - 1)):
                if (AllTeamAry[Index] = Team):
                    return Index
        return -1

    # すべての HUD制御の仕掛け(HUDを非表示にする設定済) を無効にする
    DisableAllHudController() : void =
        for (Index := 0..(HudControllerDeviceAry.Length - 1), HudController := HudControllerDeviceAry[Index]):
            HudController.Disable()

    # すべての HUD制御の仕掛け(HUDを非表示にする設定済) を有効にする
    EnableAllHudController() : void =
        for (Index := 0..(HudControllerDeviceAry.Length - 1), HudController := HudControllerDeviceAry[Index]):
            HudController.Enable()

    # すべての ムービーシーケンスの仕掛けを非表示にする
    StopAllSequenceDevice() : void =
        for (Index := 0..(SequenceDeviceAry.Length - 1), SequenceDevice := SequenceDeviceAry[Index]):
            SequenceDevice.Stop()

    # すべての ムービーシーケンスの仕掛けを表示する
    PlayAllSequenceDevice() : void =
        for (Index := 0..(SequenceDeviceAry.Length - 1), SequenceDevice := SequenceDeviceAry[Index]):
            SequenceDevice.Play()

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

UEFN 上での Verse のデバイス設定

Verse で操作したい各仕掛けを紐づけるための設定をしています。

よかったらシェアしてね!
目次