UEFN Verse言語 メタバース

【UEFN】プレイヤーをフリーズさせる方法【Verseチュートリアル】

【UEFN】プレイヤーをフリーズさせる方法【Verseチュートリアル】
みなみ

プレイヤーをフリーズさせる方法について教えてください!

りゅう

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

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

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

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

今回は、プレイヤーをフリーズさせる方法について解説します。

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

参考程度にどうぞ。

あすか

誤りがありましたら恐縮ですm(_ _)m

プレイヤーをフリーズさせる方法【5秒間フリーズ】

※音量にご注意ください。
 完全なスクリプト

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

# 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
freeze_device := class(creative_device):

    @editable
    Trigger : trigger_device = trigger_device{}
    # Runs when the device is started in a running game
    FreezePlayer(Agent: ?agent):void=
        Print("時よ、止まれ!!!")
        if(PlayerAgent := Agent?, FortCharacter := PlayerAgent.GetFortCharacter[]):
            FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowFalling := true, AllowEmotes := true})
            spawn:
                UnfreezePlayer(FortCharacter)

    UnfreezePlayer(FortCharacter : fort_character)<suspends> :void=
        Sleep(5.0)
        FortCharacter.ReleaseFromStasis()

    OnBegin<override>()<suspends>:void=
        # TODO: Replace this with your code
        Trigger.TriggeredEvent.Subscribe(FreezePlayer)
        Print("Hello World")

文言を表示

▼ 関数の定義と文言の表示

@editable
Trigger: trigger_device = trigger_device{}
# Runs when the device is started in a running game
FreezePlayer(Agent: ?agent): void =
    Print("時よ、止まれ!!!")
Trigger: trigger_device = trigger_device{}
# トリガーデバイスが trigger_device という変数に割り当てられます。
# この行は、ゲームが実行中の状態でデバイスが起動したときに実行されます。

FreezePlayer(Agent: ?agent): void =
    Print("時よ、止まれ!!!")
# FreezePlayerという関数が定義されています。関数の引数はAgentという型で、agentという名前の変数を受け取ります。
# この関数は、プレイヤーの動作を停止させるための処理を行います。
# 関数内のPrint文は、"時よ、止まれ!!!"というメッセージを表示します。

▼ この部分は、条件文(if文)として書かれており、特定の条件が満たされた場合に処理を実行します。

        if(PlayerAgent := Agent?, FortCharacter := PlayerAgent.GetFortCharacter[]):
            FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowFalling := true, AllowEmotes := true})
if(PlayerAgent := Agent?, FortCharacter := PlayerAgent.GetFortCharacter[]):
# もし、PlayerAgentという変数にAgentが割り当てられ、かつPlayerAgent.GetFortCharacter[]が成功した場合に以下の処理が実行されます。
# ?:= 演算子を使用して、PlayerAgentにAgentを代入しながら同時にPlayerAgent.GetFortCharacter[]の結果をFortCharacterに代入しています。

    FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowFalling := true, AllowEmotes := true})
# FortCharacterオブジェクトに対してPutInStasis関数を呼び出します。
# PutInStasis関数は、プレイヤーキャラクターをステータス異常(スタシス)に置くための処理を行います。
# stasis_args{...}は、関数の引数として渡されるstasis_argsというデータ構造体(データの集まり)を表します。
# この引数は、AllowTurning、AllowFalling、AllowEmotesというフラグを指定することができます。
# 上記の例では、それぞれのフラグをtrueに設定しています。

if(PlayerAgent := Agent?,の詳細

(InAgent:agent).GetFortCharacterの詳細

PlayerAgent.GetFortCharacter[]"に[]をつける理由

FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowFalling := true, AllowEmotes := true})の詳細

PutInStasis関数の詳細

stasis_argsの詳細

PutInStasis関数とstasis_args構造体の関係性

【重要】optionとクエリ演算子の詳細

GetPlayspaceを使わない理由(仮説)

FortCharacterへの代入をサボった場合に想定される問題

フリーズ・解放

▼ 下記のコードは、Fortniteゲーム内でのプレイヤーを一時停止(Stasis)させ、一定時間後に再びプレイヤーを解放するという処理を行います。

            spawn:
                UnfreezePlayer(FortCharacter)

    UnfreezePlayer(FortCharacter : fort_character)<suspends> :void=
        Sleep(5.0)
        FortCharacter.ReleaseFromStasis()
# プレイヤーを一時停止させ、一定時間後に再びプレイヤーを解放する処理を開始します。
spawn:
    # UnfreezePlayer関数を非同期的に実行します。引数にはFortniteゲーム内のキャラクターオブジェクトが指定されます。
    UnfreezePlayer(FortCharacter)

# FortCharacterを指定してプレイヤーの一時停止を解除する関数です。
UnfreezePlayer(FortCharacter : fort_character)<suspends> :void=
    # 5秒間処理を一時停止します。
    Sleep(5.0)
    # FortCharacter(プレイヤーキャラクターオブジェクト)を一時停止状態から解放するメソッドを呼び出します。
    FortCharacter.ReleaseFromStasis()

FortCharacter.ReleaseFromStasis()の詳細

イベント・サブスクライブ

        Trigger.TriggeredEvent.Subscribe(FreezePlayer)
        Print("Hello World")

プレイヤーをフリーズさせる方法【空中で5秒間フリーズ】

続いて、空中で(落下機能がオフ)5秒間フリーズするコードは以下のとおり。

完全なスクリプト


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

# 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
freeze_device := class(creative_device):

    @editable
    Trigger : trigger_device = trigger_device{}
    # Runs when the device is started in a running game
    FreezePlayer(Agent: ?agent):void=
        Print("時よ、止まれ!!!")
        if(PlayerAgent := Agent?, FortCharacter := PlayerAgent.GetFortCharacter[]):
            FortCharacter.PutInStasis(stasis_args{})
            spawn:
                UnfreezePlayer(FortCharacter)

    UnfreezePlayer(FortCharacter : fort_character)<suspends> :void=
        Sleep(5.0)
        FortCharacter.ReleaseFromStasis()

    OnBegin<override>()<suspends>:void=
        # TODO: Replace this with your code
        Trigger.TriggeredEvent.Subscribe(FreezePlayer)
        Print("Hello World")

1つ目2つ目の違い

まとめ

今回は、プレイヤーをフリーズさせる方法について解説してみました。

最後に完全なスクリプトを再掲しておきますね↓

 完全なスクリプト:5秒フリーズ

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

# 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
freeze_device := class(creative_device):

    @editable
    Trigger : trigger_device = trigger_device{}
    # Runs when the device is started in a running game
    FreezePlayer(Agent: ?agent):void=
        Print("時よ、止まれ!!!")
        if(PlayerAgent := Agent?, FortCharacter := PlayerAgent.GetFortCharacter[]):
            FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowFalling := true, AllowEmotes := true})
            spawn:
                UnfreezePlayer(FortCharacter)

    UnfreezePlayer(FortCharacter : fort_character)<suspends> :void=
        Sleep(5.0)
        FortCharacter.ReleaseFromStasis()

    OnBegin<override>()<suspends>:void=
        # TODO: Replace this with your code
        Trigger.TriggeredEvent.Subscribe(FreezePlayer)
        Print("Hello World")
 完全なスクリプト:5秒空中フリーズ

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

# 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
freeze_device := class(creative_device):

    @editable
    Trigger : trigger_device = trigger_device{}
    # Runs when the device is started in a running game
    FreezePlayer(Agent: ?agent):void=
        Print("時よ、止まれ!!!")
        if(PlayerAgent := Agent?, FortCharacter := PlayerAgent.GetFortCharacter[]):
            FortCharacter.PutInStasis(stasis_args{})
            spawn:
                UnfreezePlayer(FortCharacter)

    UnfreezePlayer(FortCharacter : fort_character)<suspends> :void=
        Sleep(5.0)
        FortCharacter.ReleaseFromStasis()

    OnBegin<override>()<suspends>:void=
        # TODO: Replace this with your code
        Trigger.TriggeredEvent.Subscribe(FreezePlayer)
        Print("Hello World")

お疲れさまでした🍵

コツコツ積み上げていきましょう。

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

あすか(Asuka)

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

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