この例で使われている 3 つのチームの中で、Infiltrator (侵入者) チームは最も独特な役割を担います。 Infiltrator にはステルス性が備わっているため、不可視の状態でゲームが開始されます。 Infiltrator は高ダメージのボルトアクション ライフルとともにスポーンされて、ディフェンダーの基地に忍び寄って陰から撃破し、スコアを獲得することができます。 ただし、Infiltrator は常に不可視であるわけではなく、攻撃を受けた場合は一時的に不可視性が失われ、ちらついて見え隠れします。
このチュートリアルでは、チームのいずれかの Infiltrator プレイヤーがダメージを受けたときにそのチームのすべての Infiltrator がちらつくようにする方法、または各 Infiltrator のちらつきを個別に維持する方法について説明します。 チーム全体がちらついて見えるようになることで、Infiltrator としてのゲームプレイはより難しくなりますが、より慎重にプレイすることが促進されます。
以下の手順では、Infiltrator をそのスポーン時に不可視にする方法を示します。
Invisibility Manager を作成する
invisibility_manager という名前の新しい Verse の仕掛けを Verse Explorer で作成し、その仕掛けをレベルにドラッグします。
「
invisibility_manager」ファイルの冒頭にusing { /Fortnite.com/Characters }を追加して、プレイヤーに関連付けられたfort_characterを取得します。using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics }invisibility_managerクラス定義に次のフィールドを追加します。PlayerSpawnersプレイヤー スポナーの編集可能な配列。 これは Infiltrator のプレイヤー スポナーをトラックする配列で、Infiltrator をそのスポーン時に不可視にする際に使用されます。invisibility_manager := class(creative_device): Logger:log = log{Channel := triad_invisibility_log_channel} # Infiltrator チームのプレイヤー スポナーの配列 @editable PlayersSpawners:[]player_spawner_device = array{}編集可能な
IsVisibilitySharedロジック。 このロジックによって、ダメージを受けた後のちらつきを、すべての Infiltrator に同時に適用するか、ダメージを受けた Infiltrator プレイヤーのみに適用するかが決まります。# Infiltrator チームのプレイヤー スポナーの配列 @editable PlayersSpawners:[]player_spawner_device = array{} # Infiltrator の可視性をチームメートと共有するかどうか。 @editable IsVisibilityShared:logic = true編集可能な
VulnerableSeconds浮動小数値と、編集可能なFlickerRateSeconds浮動小数値。 最初の浮動小数値ではダメージを受けた後の Infiltrator のちらつきの長さを制御し、2 番目の浮動小数値ではちらつきのアニメーションの再生速度を制御します。# Infiltrator の可視性をチームメートと共有するかどうか。 @editable IsVisibilityShared:logic = true # Infiltrator がダメージを受けた後、どのくらいの時間視認できるか。 @editable VulnerableSeconds:float = 3.0 # Infiltrator がダメージを受けた後に、Infiltrator がどれくらいの速さでちらつくか。 @editable FlickerRateSeconds:float = 0.4Teamsという名前の変数チーム配列。 これを使用して、プレイヤーが Infiltrator であるかどうかを確認します。# Infiltrator がダメージを受けた後にどれくらいの速さでちらつくか。 @editable FlickerRateSeconds:float = 0.4 # ゲーム内のすべてのチームの配列。 var Teams:[]team = array{}agentからfloatへの、PlayerVisibilitySecondsという名前の変数マップ。 これにより、個別のエージェントが、ダメージを受けた後のちらつきの残りの秒数にマッピングされます。var Teams:[]team = array{} # ゲーム内のすべてのチームの配列。 var Teams:[]team = array{} # ちらつきの残りの秒数に対するプレイヤーのマップ。 var PlayerVisibilitySeconds:[agent]float = map{}
仕掛けが開始されたことを確認するためのシンプルなログ文を
OnBegin()に追加します。 誤ったチームのプレイヤーが不可視になることを回避するために、triad_infiltration_gameスクリプトによってチームのバランスが調整された後にinvisibility_managerが実行されることを確認してください。 これを確実にするには、OnBegin()でコードを実行するのではなく、invisibility_managerをtriad_infiltration_gameから開始します。OnBegin<override>()<suspends>:void= # プレイヤーを不可視にするイベントにサブスクライブする前に、チームのバランスが整うまで待機します。 Logger.Print("Waiting for teams to be balanced...")新しい
OnPlayerSpawn()メソッドをinvisibility_managerクラス定義に追加します。 Infiltrator がそのスポーン時に常に不可視になるようにするために、この関数を最初に処理します。Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!")OnPlayerSpawn()で、スポーンされたエージェントに関連付けられたfort_characterを、GetFortCharacter[]を使って取得して、それをFortCharacter変数に保存します。 さらに、スポーンされたエージェントのチームをGetTeam[]を使って取得し、それをCurrentTeam変数に保存します。Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!") if: FortCharacter:fort_character = SpawnedAgent.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[SpawnedAgent]CurrentTeamがTeams配列内の最初のチーム (Infiltrator であるはず) と一致するかどうかをチェックします。 一致する場合は、このエージェントが Infiltrator であるため、そのエージェントのFortCharacterに対してHide()を呼び出すことができます。 そうすると、エージェントがそのスポーン時に不可視になります。OnPlayerSpawn()関数は次のようになるはずです。Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!") if: FortCharacter:fort_character = SpawnedAgent.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[SpawnedAgent] Teams[0] = CurrentTeam Logger.Print("Player spawned as an infiltrator, making them invisible") then: FortCharacter.Hide()
新しい
StartInvisibilityManager()メソッドをinvisibility_managerクラス定義に追加します。 この関数は、team 型の配列AllTeams、player 型の配列AllPlayers、team型の Infiltrator チームへの参照を受け取ります。 これをtriad_infiltration_gameから呼び出してinvisibility_managerのロジックを開始するため、この関数に<public>指定子を付けて、triad_infiltration_gameで見つかるようにする必要があります。# Invisibility Manager のロジックを開始します。 チームのバランス調整後に triad_infiltration クラスから呼び出されます StartInvisibilityManager<public>(AllTeams:[]team, AllPlayers:[]player, Infiltrators:team):void= Logger.Print("Invisibility script started!")StartInvisibilityManager()で、次の手順を実行します。Teams配列をAllTeams配列に設定します。# Invisibility Manager のロジックを開始します。 チームのバランス調整後に triad_infiltration クラスから呼び出されます StartInvisibilityManager<public>(AllTeams:[]team, Players:[]player, Infiltrators:team):void= Logger.Print("Invisibility script started!") set Teams = AllTeamsforループ内で、PlayerSpawnersのそれぞれのプレイヤー スポナーをOnPlayerSpawn()関数にサブスクライブします。for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn)スクリプトが開始されたら、それぞれの Infiltrator を特定してそれらを不可視にします。 また、
PlayerVisibilitySecondsマップにそれらのエントリも作成します。 後でこれを使用して、ダメージを受けたそれぞれの Infiltrator がちらつく時間をトラックします。OnPlayerSpawn()での処理と同様に、各プレイヤーのfort_characterとteamを取得します。Versefor(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) # For each player, if they spawned on the infiltrator team, spawn an OnInfiltratorDamaged function for that # player. Then make their character invisible. for(TeamPlayer:AllPlayers): if: FortCharacter:fort_character = TeamPlayer.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[TeamPlayer]CurrentTeamが、この関数に渡したInfiltratorsチームと一致するかどうかをチェックします。 一致する場合は、PlayerVisibilitySeconds内のプレイヤーのキーを「0.0」に設定します。Versefor(TeamPlayer:AllPlayers): if: FortCharacter:fort_character = TeamPlayer.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[TeamPlayer] Logger.Print("Got this player's current team") Infiltrators = CurrentTeam set PlayerVisibilitySeconds[TeamPlayer] = 0.0 Logger.Print("Added player to PlayerVisibilitySeconds")最後に、プレイヤーの
FortCharacterに対してHide()を呼び出すことで、このプレイヤーを不可視にします。StartInvisibilityManagerは次のようになるはずです。Verse# Starts the invisibility manager logic. Called from triad_infiltration class after team balancing finishes StartInvisibilityManager<public>(AllTeams:[]team, Players:[]player, Infiltrators:team):void= Logger.Print("Invisibility script started!") set Teams = AllTeams for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) # For each player, if they spawned on the infiltrator team, spawn an OnInfiltratorDamaged function for that # player. Then make their character invisible. for(TeamPlayer:AllPlayers):
トリプル侵入ゲームから Invisibility Manager を呼び出す
triad_infiltration_gameに戻り、編集可能なinvisibility_managerをクラス定義に追加します。 これが、triad_infiltration_gameの仕掛けによって呼び出される、レベル内の仕掛けになります。# Infiltrator の可視性を制御する invisibility_manager スクリプトへの参照。 @editable InvisibilityManager:invisibility_manager = invisibility_manager{}BalanceTeams()への呼び出しの後のOnBegin()関数内で、StartInvisibilityManager()を呼び出して、Teams、AllPlayers、Infiltratorsを渡します。OnBegin()関数は次のようになるはずです。VerseOnBegin<override>()<suspends>:void = # Get all the Teams set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Save the teams to later reference them set MaybeInfiltrators = option{Teams[0]} set MaybeAttackers = option{Teams[1]} set MaybeDefenders = option{Teams[2]} if: Infiltrators := MaybeInfiltrators?ファイルを保存してコンパイルします。 この仕掛けをアウトライナー内で選択し、Infiltrator 用のすべてのスポーン パッドを PlayerSpawners 配列に割り当てます。
triad_infiltration_game の仕掛けをアウトライナー内で選択し、invisibility_manager の仕掛けをその InvisibilityManager プロパティに割り当てます。
UEFN ツールバーの [Launch Session (セッションを開始)] をクリックしてレベルをプレイテストします。
レベルをプレイテストすると、それぞれのプレイヤーが差分が最も大きいチームに割り当てられて、所属するチームに適切な武器とともにスポーンされるはずです。 それぞれの Infiltrator は、ゲームの開始時とスポーン時の両方で不可視になるはずです。
次のステップ
このチュートリアルの次のステップでは、Infiltrator がダメージを受けたときに、Infiltrator のキャラクターをちらつかせる方法について説明します。