【UEFN】Verseで「敵のHPを吸い取る仕組み」を実装する

今回は敵にダメージを与えることで自分のHPを回復する仕組みを作っていきます。
コードは以下の動画を参考にしています

目次

コードの全体

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


life_steal_device := class(creative_device): 


    HealAttacker( Result : damage_result) : void = 
        Amount := Result.Amount 
        if (Instigator := Result.Instigator?, Agent := Instigator.GetInstigatorAgent[], FortCharacter := Agent.GetFortCharacter[]): 
            HealAmount := Amount * 0.2 
            FortCharacter.Heal(HealAmount) 


    HandlePlayerJoin ( Player : player ) : void = 
        if (FortCharacter := Player.GetFortCharacter[]): 
            FortCharacter.DamagedEvent().Subscribe(HealAttacker) 


    OnBegin<override>()<suspends>:void= 
        for (Player : GetPlayspace().GetPlayers(), FortCharacter := Player.GetFortCharacter[]): 
            FortCharacter.DamagedEvent().Subscribe(HealAttacker) 
        GetPlayspace().PlayerAddedEvent().Subscribe(HandlePlayerJoin) 

関数宣言

11行目からHealAttacker関数を宣言しています。 
コードブロックの意味以下のようになります。 

1.damage_result構造体のAmountメンバーにアクセスして相手に与えたダメージ量を取得。 
2.damage_result構造体のInstigatorメンバーにアクセスして、攻撃したプレイヤーのagent、fort_character情報取得。 
3.与えたダメージ量×0.2だけプレイヤーのHP回復 

この関数は20行目と25行目のDamagedEventをきっかけに呼び出されるため、パラメータはdamage_result型となります。 

damage_resultは構造体でメンバーのAmountにはダメージ量Instigatorには攻撃したプレイヤーの情報が入っています。 

12行目でAmountにアクセスして、ダメージ量を取得しています。 

Instigatorはオプション型でアクセスは失敗コンテキスト内で行う必要があるため、If文内で行われています。
アクセスした情報から、攻撃したプレイヤーのagent情報、fort_character情報の取得も失敗コンテキスト内で行っています。 

14行目で、回復量を決めています。
このコードでは、与えたダメージ量の20%としています。 

そして、15行目でHeal関数を呼び出し、プレイヤーを回復しています。 

18行目からHandlePlayetJoin関数を宣言しています。 
コードブロックの意味は以下のようになります。 

1.新たに参加したプレイヤーのplayer情報からfort_character情報を取得 
2.プレイヤーにDamagedEventが発生したら、HealAttacker関数を呼び出す 

この関数は途中参加したプレイヤーにもこの仕組みを適用できるようにするための関数です。 
26行目のPlayerAddEventをきっかけに呼び出されるためパラメータはplayer型となります。 

OnBegin~

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

1.ゲーム内にいる全てのプレイヤーのplayer情報を取得 
2.player情報からfort_character情報を取得 
3.プレイヤーにDamagedEventが起きたらHealAttacker関数を呼び出す 
4.PlayerAddEventが起きたらHandlePlayerJoinを呼び出す 

24行目のforは指定回数だけ、コードブロック内の式を繰り返したいときに使われます。 
指定回数のところには、配列を入れることもでき、その場合は配列内の全ての要素に対して、コードブロック内の式を実行するという意味になります。 

今回のコードではゲーム内の全てのプレイヤーのplayer情報が配列としてPlayerに入っているため、Playerの全てに対してコードブロック内の式はが適用されます。 

GetPlayspaceはfort_playspace型(ゲームの空間情報)を返します。
それに対して、GetPlayersメソッドを呼び出すことで、ゲーム内の全てのプレイヤーのplayer情報を取得しています。 


このようなコードで、相手プレイヤーにダメージを与えることで、
自分のHPを回復する仕組みが作れます。

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

この記事を書いた人

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

コメント

コメント一覧 (8件)

  • とても参考になる記事ありがとうございます!
    いつも勉強になります!
    条件付きボタンを押したらこの能力が使えるようにするにはどうしたら良いのでしょうか?

    • コメントありがとうございます!
      以下のようにしてはどうでしょうか
      1.相手プレイヤーを対象にDamage関数を、自分を対象にHeal関数を呼び出す関数を宣言
      2.条件付きボタンのActivatedEventが起きたら、1の関数を呼び出す

      わからないところがあればまた聞いてください!

      • まさか返信くださるなんて!
        ありがとうございます!
        初心者すぎて、図々しい質問でしたら申し訳ありません。
        SHUNさんが考えてくださった案を考えてみたのですが分からず教えてください。
        記事で紹介している、SHUNさんの完璧なコードのどこにどんな文言を入れれば良いのか教えてくださると嬉しいです。

        • 分かりました!コードとその解説を書こうと思うので2つ質問させてください!

          1.「ボタンを押したら即座に、あいてのHPを減らして、じぶんのHPを回復する仕組み」を作りたいのか「ボタンを押したらそれ以降、ボタンを押したプレイヤーの攻撃が相手のプレイヤーのHPを吸収するようになる仕組み」を作りたいのかどちらでしょうか
          (最初の返信で書いた案は、前者の仕組みのためのものなので、後者の方でしたら無視してください)

          2.条件付きボタンの条件は何を想定していますでしょうか?

  • 返信が遅れてしまい申し訳ございません
    記事を書いてくださるとのこと大変嬉しいです!ありがとうございます!!

    質問についてですが
    1は後者です
    2はゴールドを想定してます

    もう少し詳細をお話しします。
    何個も条件付きボタンが並んでいて
    条件付きボタンを押すと色んな能力が獲得できる仕組みを作りたいです。
    (条件付きボタン一つにつき獲得できる能力は一つのみです。違う種類の能力を手に入れるためには違う条件付きボタンを押す必要があります。)

    色んな能力とは、HPを吸い取る能力や条件付きボタンを押したプレイヤーが見えなくなる能力や攻撃されたプレイヤーが固まる能力などです。

    能力同士は複数ゲットできる訳ではなく
    違う種類の条件付きボタンを押したら
    違う種類の能力に移行する仕組みです。

    能力が切り替わるタイミングや
    能力を手に入れるタイミングは
    自ら条件付きボタンを押した時のみです。
    撃破したりされたりのタイミングでは
    能力は継続します

    私が参考にしているマップがあるので
    念の為載せておきます。
    このマップの「vampire」という能力を作りたいです。
    マップコード:5706-5151-0681

    長々と書いてしまい申し訳ないです。
    よろしくお願いします!

    • 遅れてすみません!
      明日解説記事を投稿できそうですのでもう少しお待ちください! 

  • 私も返信遅くなりすみません!!
    記事楽しみにしております!
    ありがとうございます!

    • コードちゃんと動くかの確認に手間取って、遅れました!
      記事投稿したので見てみてください!
      また質問があればコメントにどうぞ!

コメントする

目次