【UEFN】Verseで「プレイヤーの動きを止める仕組み」を実装する

このようなプレイヤーの動きを止める仕組みを作っていきます。



今回のコードは以下を参考にしています

目次

コードの全体

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

freeze_device := class(creative_device): 
    @editable 
    Trigger : trigger_device =trigger_device{} 

 
    FreezePlayer( Agent :?agent) : void = 
        If (PlayerAgent :=Agent?, FortCharacter :=PlayerAgent.GetFortCharacter[]): 
            FortCharacter.PutInStasis(stasis_args{AllowTurning :=false, AllowFalling := false,  AllowEmotes := false }) 

            spawn: 
                UnfreezePlayer(FortCharacter) 

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

 
    OnBegin<override>()<suspends>:void= 
        Trigger.TriggeredEvent.Subscribe(FreezePlayer) 

コードの解説

冒頭

今回の仕組みではプレイヤーが固まるきっかけでトリガーデバイスを使うため、9行目で定義しています。 

関数宣言

12行目からFreezePlayer関数を定義しています。 
コードブロックの意味は以下のようになります。

1.agent情報からfort_character情報を取得 
2.フォートナイトキャラクターの回転、落下、エモートを禁止 
3.UnfreezePlayer関数を実行 

この関数はTriggeredEventをきっかけに呼び出されるため、パラメーターはagent型になります。

パラメーターの?はoption型の?です。 
option型にすると、値なしという状態を作ることが出来ます。 
今回のコードでは、プレイヤーがトリガーを踏んでTriggeredEventが起きた場合、踏んだプレイヤーのagent情報が値として取得されますが、プレイヤーが踏む以外でTriggeredEventが発生した場合値はなしとなります。 

13行目のifは条件分岐というよりは、失敗する可能性のある式を失敗コンテキストであるif文の括弧内に書くために使われています。 
PlayerAgent :=Agent?の式は、オプション内の要素へアクセスする式ですがこれは失敗する可能性のある式です。 
FortCharacter :=PlayerAgent.GetFortCharacter[]の式は、agent情報からfort_character情報を取得する式ですが、同様に失敗する可能性のある式です。 

14行目でPutInStasisメソッドをFortCharacter対象に呼び出していますが、PutInStasisメソッドのパラメーターはstasis_args構造体です。 

このメソッドはプレイヤーを静止状態にし、stasis_argsで指定された特定の動きを防ぐ関数ですが、今回のコードではstasis_argsの全てのメンバーをfalseにして、回転、落下、エモートを全て禁止しています。 

その後17行目でUnfreezePlayer関数が呼び出されますが、その前にspawnと書かれています。 
spawnとは、複数の式を並列的(同時に)に実行するために使われるものです。 

今回のコードの場合、asyncな(処理に時間がかかる)UnfreezePlayer関数をFreezePlayer関数の呼び出しと同時に実行したいため、spawnを使います。 

20行目でUnfreezePlayer関数が宣言されています。 
コードブロックの意味は以下のようになります。

1. 5秒間コードの実行停止 
2. プレイヤーの静止状態解除 

Sleep関数はasync式(処理に時間がかかる式) であるため、これを含むUnfreezePlayer関数はasync関数となります。その場合、asyncであることを示すために、パラメーターの後ろにsuspends指定子を書きます。 

UnfreezePlayer関数でも、静止しているプレイヤーのfort_character情報を使いたいため、パラメーターで引き継ぎます。 

Fortcharacterに対してプレイヤーの静止状態を解除するReleaseFromStasis()メソッドを呼び出しています。 

OnBegin~

25行目以降がゲーム開始時から実行されるコードですが 
コードブロックの意味は以下のようになります。 

TriggeredEventが起きたら、FreezePlayer関数を実行する 





以下のように動けば完成です。
今回はプレイヤーが固まるきっかけをトリガーにしていますが、
ダメージを受けたときをきっかけにすれば当てたら相手が固まる武器を作れます。

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

この記事を書いた人

メタバースに興味を持ち、UEFN、Verseを学びながらFortniteでゲーム制作しています。
初心者でも理解できるような記事を書くことを心がけております。
間違いがありましたら指摘よろしくお願いいたします。

コメント

コメントする

目次