チームを設定する
このセクションでは、ゲーム開始時のハンター チームと小道具チームを設定し、それぞれの開始エリアにチームをテレポートさせる方法について説明します。
このページには、このゲームプレイで必要なゲームプレイ メカニクスの実行方法を示す Verse のスニペットが含まれています。以下の手順を実行してから、このチュートリアルの ステップ 6 にある完全なスクリプトをコピーしてください。
以下の手順を実行すると、チームを正しく設定できます。
-
新しい関数 SetupTeams() を作成します。ここでは、小道具が撃破されたときの関数や、プレイヤーがゲームに参加したときの処理のための関数など、後で定義する関数の複数のサブスクリプションを設定します。
# ラウンドが開始されたら、チームの仕掛けをサブスクライブし、ハンター エージェントをランダムに選択して、ハンター タイマーを有効にし、小道具エージェントを設定して、ゲーム エリアにテレポートさせます。 SetUpTeams()<suspends>:void = Logger.Print("Setting up teams.") -
まず、小道具チームのスコア タイマーの SuccessEvent と、小道具チームの TeamManager の Eliminated Event をサブスクライブし、スコア マネージャーの付与するスコアを設定します。
# ラウンドが開始されたら、チームの仕掛けをサブスクライブし、ハンター エージェントをランダムに選択して、ハンター タイマーを有効にし、小道具エージェントを設定して、ゲーム エリアにテレポートさせます。 SetUpTeams()<suspends>:void = Logger.Print("Setting up teams.") # 小道具チームのスコア タイマーをサブスクライブし、付与するスコアを設定して、小道具チームの撃破イベントをサブスクライブします。 PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # 小道具エージェントが撃破されたときに行われます。 -
次に、ハンター チームで同じ操作を実行します。その後、ハンター チームの待機タイマーを、ハンターに設定したいスポーンの遅延に設定します。
# ラウンドが開始されたら、チームの仕掛けをサブスクライブし、ハンター エージェントをランダムに選択して、ハンター タイマーを有効にし、小道具エージェントを設定して、ゲーム エリアにテレポートさせます。 SetUpTeams()<suspends>:void = Logger.Print("Setting up teams.") # 小道具チームのスコア タイマーをサブスクライブし、付与するスコアを設定して、小道具チームの撃破イベントをサブスクライブします。 PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # 小道具エージェントが撃破されたときに行われます。 # ハンター チームの待機タイマーをサブスクライブし、期間を設定します。また、ハンター チームの撃破イベントをサブスクライブします。 HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # ハンター エージェントが小道具エージェントを撃破するときに行われます。 -
引き続き
SetupTeams()内で、スタート時のハンター エージェントと小道具エージェントの配列を初期化し、ゲームを開始するのに十分な人数のプレイヤーがいるかどうかを確認しながら、待機中の HUD を有効にします。十分な人数のプレイヤーがいる場合は、待機中の HUD を無効にします。# スタート時のハンターと小道具エージェントの配列を初期化します。プレイヤーを取得し、サーバー内のプレイヤー数を確認します。 var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() #プレイヤーを待機するのに適した HUD を有効にします。 HUDControllerWaiting.Enable() # ラウンドを開始するのに十分な人数のプレイヤーがいるかどうかを確認します。 set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("Round started.") #次に優先順位の高い HUD を使用するために、待機中の HUD を無効にします。 HUDControllerWaiting.Disable() -
ラウンドが開始されたため、プレイヤーがマッチに参加したり、マッチから除外されたりしたときの処理を行う必要があります。ここでサブスクリプションを設定し、後でこれらの関数を定義します。
# ラウンドが開始されたため、マッチへのプレイヤーの追加またはマッチからの削除を処理する必要があります。これらのイベントをサブスクライブします。 GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved) -
開始時のハンターの数は、ゲームに参加しているプレイヤーの数に基づいています。 1 人のハンターが 10 人のプレイヤーを相手にするような状況は回避する必要があるため、数式に基づいてハンターの数を設定する関数を設定します。 プレイヤーの数を式で使用する float に変換します。
# プレイヤー数とプレイヤー数あたりのハンター エージェント数に基づいて、ゲーム開始時のハンター エージェントの数を計算します。 NumberOfPlayers:float = 1.0 * Players.Length # 次の Ceil 関数で使用できるように、Players.Length を float に変換します。 -
ここで、開始時のハンターの数を次の式の上限値に設定します。次に、全プレイヤーの配列をシャッフルします。これは、初期のハンターをプレイヤー リストからランダムに選択したいためです。
# プレイヤー数とプレイヤー数あたりのハンター エージェント数に基づいて、ゲーム開始時のハンター エージェントの数を計算します。 NumberOfPlayers:float = 1.0 * Players.Length # 次の Ceil 関数で使用できるように、Players.Length を float に変換します。 if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1,HunterTeam.HunterAgentPerNumberOfPlayers)]): # プレイヤーをシャッフルして、配列をスライスすることで、開始時のハンター エージェントを取得します。残りのプレイヤーは、開始時の小道具エージェントになります。 var RandomizedPlayers:[]agent = Shuffle(Players) -
ランダム化された配列を、0 から開始時のハンター数までの間のサイズにスライスします。これが最初のハンターのチームになるため、StartingHunterAgents に設定します。 残りのプレイヤーは初期の小道具チームになるため、StartingPropAgents に設定します。
# プレイヤー数とプレイヤー数あたりのハンター エージェント数に基づいて、ゲーム開始時のハンター エージェントの数を計算します。 NumberOfPlayers:float = 1.0 * Players.Length # 次の Ceil 関数で使用できるように、Players.Length を float に変換します。 if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1,HunterTeam.HunterAgentPerNumberOfPlayers)]): # プレイヤーをシャッフルして、配列をスライスすることで、開始時のハンター エージェントを取得します。残りのプレイヤーは、開始時の小道具エージェントになります。 var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {} if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # 開始時のハンター エージェントをイテレートし、ハンター チームに割り当てます。次にハンター待機タイマーをスタートさせます。 Logger.Print("Setting {StartingHunterAgents.Length} hunter agent(s).") for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start() # 開始時の小道具エージェントをイテレートし、小道具チームに割り当て、プレイ エリアにテレポートさせます。 Logger.Print("Setting {StartingPropAgents.Length} prop agent(s).") -
チームを設定した状態で、ロビー テレポーターを有効にして小道具をスタート ルームからテレポートさせ、ハートビートをアクティブ化します。 次に、ロビー テレポーターはこれ以降必要ないため無効にします。 最後に、PropsRemainingTracker の小道具の残りの数を、小道具チームのサイズに設定します。
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # 小道具の残り Tracker のターゲットおよび値を現在の小道具数に設定します。 # 将来的には、小道具が撃破されたときにのみ値が更新されるようになります。 PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
プレイヤーの撃破を管理する
ハンターは、すべての小道具を撃破して、小道具をハンターに変えることで勝利します。 以下の手順を実行すると、小道具が撃破されたときにハンターにスコアを付与し、撃破された小道具をハンター チームに転送できます。
-
OnHunterEliminated() という名前の関数を作成します。先ほどハンター チームのマネージャーの仕掛け EnemyEliminatedEvent がこれをサブスクライブしたため、ハンターが小道具を撃破するたびにこれがアクティブ化されます。
# ハンター エージェントが小道具エージェントを撃破すると、スコアが付与されます。スコアは残りの小道具エージェントの数で除算されます。 OnHunterEliminated(HunterAgent:agent):void = Logger.Print("ハンター エージェントが小道具エージェントを撃破しました。") -
まず、ハンターに残りの小道具エージェントの数に比例したスコアを付与する必要があります。
PropTeamSizeで除算されたMaxEliminationScoreに等しい変数EliminationAwardを作成します。ハンター チームのスコア マネージャーにそのスコアを設定し、撃破してスコアを獲得したハンターに付与します。# ハンター エージェントが小道具エージェントを撃破すると、スコアが付与されます。スコアは残りの小道具エージェントの数で除算されます。 OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Hunter agent eliminated a prop agent.") PropTeamSize := PropTeam.Count() if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print("Awarding {EliminationAward} points.") HunterTeam.ScoreManager.SetScoreAward(EliminationAward HunterTeam.ScoreManager.Activate(HunterAgent) -
小道具が撃破された際の小道具チームの処理も実行する必要があります。 OnPropEliminated() という名前の関数を作成します。 OnHunterEliminated() と同様に、先程この関数をサブスクライブしました。 小道具が撃破されたら、小道具チームの EliminateAgent() 関数を使用して小道具チームからその小道具を削除し、次に、ハンター チームの InitializeAgent() 関数を使用してハンターとして初期化する必要があります。
# 小道具エージェントが撃破されたら、小道具チームからその小道具を削除し、ラウンドが終了するかどうかを確認して、小道具をハンターとして設定します。 OnPropEliminated(PropAgent:agent):void = Logger.Print("Prop agent eliminated.") spawn{ PropTeam.EliminateAgent(PropAgent) } HunterTeam.InitializeAgent(PropAgent)
プレイヤーのゲームへの参加とゲームからの退出を管理する
プレイヤーがラウンドの途中でゲームに参加したは、プレイヤーがハンターとしてスポーンされるようにします。
-
この処理を行うために OnPlayerAdded() 関数を作成しますこの関数は、参加したプレイヤーをハンターとして初期化するだけです。
# プレイヤーがラウンドの途中でマッチに参加したときに、そのプレイヤーをハンターにします。 OnPlayerAdded(Player:player):void= Logger.Print("A player joined the game.") HunterTeam.InitializeAgent(Player) -
プレイヤーがマッチから退出した場合の処理は少し複雑です。プレイヤーがマッチから退出した場合、そのプレイヤーが所属するチームからそのプレイヤーを削除し、さらにそのプレイヤーの退出によってマッチが終了するかどうかを確認する必要があります。退出したプレイヤーが最後の小道具であるか、唯一のハンターである場合に、マッチが終了します。このロジックは各チームの EliminateAgent() 関数で処理されるため、削除されたプレイヤーが所属していたチームに応じて、そのインスタンスをスポーンします。
# プレイヤーがマッチから退出すると、プレイヤーが所属していたチームを確認し、ラウンドが終了するかどうかを確認します。 OnPlayerRemoved(Player:player):void= Logger.Print("A player left the game.") if (PropTeam.FindOnTeam[Player]): Logger.Print("Player was a Prop.") spawn{ PropTeam.EliminateAgent(Player) } if (HunterTeam.FindOnTeam[Player]): Logger.Print("Player was a Hunter.") spawn{ HunterTeam.EliminateAgent(Player) }
RoundEnd
すべてのチームが設定されたら、各チームのサイズを監視して、ラウンドが終了するかどうかを確認する必要があります。 どちらかのチームが空になるか、ラウンド時間がなくなるとゲームが終了するため、どちらが先に発生するかをレース式を使用して確認します。
-
OnBegin() 関数の末尾のレース式で、ハンター チームと小道具チームの TeamEmptyEvent と、RoundTimer の AwaitEnd() 関数の両方を Await() (待機) します。 レースが終了したら、次のステップで定義する EndRound() 関数を呼び出します。
# 小道具エージェントかハンター エージェントがいなくなるか (どちらか早く発生する方)、ラウンド タイマーが終了するか、ラウンドが終了する場合は、 race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd() Logger.Print("Round ending.") EndRound() -
EndRound () 関数で、小道具チームの各プレイヤーのハートビート センサーを無効にし、RoundSettings (ラウンド設定) の仕掛けで EndRound () を呼び出す必要があります。 RoundSettings の仕掛けの EndRound() 関数にはプレイヤーをこの仕掛けに渡す必要があるため、Players 配列で最初のプレイヤーを取得し、そのプレイヤーを発信者として渡します。
#ハートビート VFX をクリーンアップし、ラウンドを終了します。 EndRound():void= PropTeam.HeartBeat.DisableAll() # プレイヤーを取得して EndRound に渡します。 Players:[]player = GetPlayspace().GetPlayers() if (RoundEndInstigator := Players[0]): Logger.Print("Round ended.") RoundSettings.EndRound(RoundEndInstigator)