ラウンドを追加する これにより、プレイヤーはプレイスタートと終了ポイントを明確にして、ゲームプレイをフェーズに構造化できます。これは、チームベースのゲームプレイに特に重要です、プレイヤーはそのラウンド中にチームのメンバーがいるかどうかによってプレイスタイルを変更できます。
このチュートリアルのセクションでは、サンプルレーザータグエクスペリエンス を参照して、このセクションのチュートリアルでは、Roblox の内蔵機能を構造する方法を説明しています。これには、スクリプトガイドが含まれます:
- 個々のチームポイントをリセットし、チームスポーンゾーンにプレイヤーをスポーンすることで、ラウンドを開始します。
- プレイヤーの画面の上部にある目標を設定する変数をカスタマイズします。
- チームのスコアのためにプレイヤーのポイントの貢献を追跡します。
- プレイヤーのチームがラウンドを勝利したかどうかに応じて、ユニークな UI 画面をトリガーします。
- プレイヤーを切断して、中立ロビーにスポーンすることでラウンドを終了します。
このセクションを完了すると、プレイヤーにとって正確で満足したブラスターの動作を実装する方法を学びます。
ループを開始
ServerScriptService > ゲームプレイ > ラウンド ハンドルは、ラウンドの開始についてのロジックを実装
スコア
function Scoring.resetScores()
for _, player in Players:GetPlayers() do
player.leaderstats.Points.Value = 0
end
for _, team in Teams:GetTeams() do
team:SetAttribute(GuiAttribute.teamPoints, 0)
end
end
さあ、みんながゼロのポイントから始
現在ロビーにいるプレイヤーの場合、startRoundLoopAsync() は、spawnPlayersInMap 機能の中のすべてのプレイヤーを ra운ドプレイヤーズインマップ に移動させます。
ロビーグループがチームにソートされた後、新しいプレイヤーがエクスペリエンスに参加すると、startRoundLoopAsync() は、Players.PlayerAdded:Connect イベントをリスニングし、 spawn
ラウンド
-- マップにすべてのプレイヤーをスポーンさせる
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- 参加するとマップに新しいプレイヤーをスポーンする
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
目標を設定
さあ、各プレイヤーがチームメイトとアリーナに入ったので、エクスペリエンスはラウンドで成功するための指示を提供する必要があります。サンプルレーザータグエクスペリエンスは、各プレイヤーの画面のトップにクリアなガイドが付いた目標を提供して、チームが勝利するために何をすべきかを示します。
UI カリキュームで 目標 UI 構成を学び、表示する方法については、このセクションに掲載されている [ラウンド開始] を参照してください。
実行時にプレイヤーにスコアを入力する必要があるという目的のプロンプトにもかかわらず、 StarterGui > HUDGui のプロンプトを調べると、代わりに配置可能な「%d」がポイントの価値に配置可能な「2> %d2>」を含めていることがわかります。
「%d」は、 TEAM_SCORE_LIMIT »変数を ReplicatedStorage > TEAM_SCORE_LIMIT で更新することで、ゲームプレイ要件を満たすためにいつでも増加または減少できるプレースホルダーストリングです
チームスコアリミット
local TEAM_SCORE_LIMIT = 200 -- 更新された行、戻戻るを確認してくださいreturn TEAM_SCORE_LIMIT
この単純な変更は、ラウンド開始時に ReplicatedStorage > HUDGuiSetup > SetObjective が、UI オブジェクトの 1> TEAM_SCORE_LIMIT1> モジュールスクリプトを交換するために必要になります。これにより、UI オブジェクトの 4>
チームスコアリミット
local TEAM_SCORE_LIMIT = require(ReplicatedStorage.TEAM_SCORE_LIMIT)
local function setObjective(gui: ScreenGui)
local bodyTextLabel = gui.Objective.ObjectiveDisplay.Body.BodyTextLabel
bodyTextLabel.Text = bodyTextLabel.Text:format(TEAM_SCORE_LIMIT)
end
トラックポイント
プレイヤーがラウンドの目標を持ったので、エクスペリエンスはそれらのチームのポイントを追跡する必要があります。また、Teams サービスのデフォルト動作は、各プレイヤーが目標に到達するまで各チームのポイント
これが起こらないように、チームの目標へのすべての貢献を保持するために、 ReplicatedStorage > HUDGuiSetup > StartSyncingTeam
チームカウンター と チームバウンター を見つけると、それらの属性の teamColor を取得し、チームスポーンゾーンに関連付けられます:チームカウンターは緑チームのポイントを表示し、チームバウンターはピンクチームのポイントを表示します:チームカウンターは緑チームのチームのポイ
開始同期チームポイント
local function startSyncingTeamPoints(gui: ScreenGui)
for _, teamPointCounter in gui.Objective.TeamPointCounter:GetChildren() do
if not teamPointCounter:IsA("GuiObject") then
continue
end
local iconTeamColor = teamPointCounter:GetAttribute(GuiAttribute.teamColor)
その後、モジュールスクリプトは getTeamFromTeamColor 関数を呼び出して、チームカウンターの mint 属性とチームバウンターの teamColor 属性が、それぞれ対応
開始同期チームポイント
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
これが発生すると、startSyncingTeamPoints は、両チームのカウンターの両方の TextLabel オブジェクトをそれぞれのチームポイントの相当する teamPoints 値に設定し、プレイヤーがタグを追加して他のチームのプレイヤーを追放すると、更新されます。
開始同期チームポイント
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
このセクションの以前のすべての内容は、プレイヤーの画面でポイントを追跡する方法に焦点を合わせていますが、サーバーでポイントを追跡するロジックをレビューすることは重要です。チームが目標を達成し、ラウンドを勝利するためにサーバー
スコア
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
次に、incrementScore 関数を呼び出し、次のアクションを実行します:
- Class.Team オブジェクトの Teams サービスで、プレイヤーのチームとチームポイントの価値をグラビュアし、その後、Class.Team オブジェクトに追加します。
- リーダーボードにプレイヤーの個々のスコアを取得し、1つ追加します。
- プレイヤーのチームとスコアの両方で以前に述べたバインド可能なイベントを発動します。
このプロセスは、クライアントとサーバーの両方のプレイヤーの個々のスコアとチームのスコアに関して、両方のプレイヤーに一貫性を保ちます。
スコア
function Scoring.incrementScore(player: Player, amount: number)
local team = player.Team
assert(team, `Player {player.Name} must be on a team to score a point, but has no team`)
local teamPoints = team:GetAttribute(GuiAttribute.teamPoints)
teamPoints += amount
team:SetAttribute(GuiAttribute.teamPoints, teamPoints)
local leaderstat = player.leaderstats.Points
leaderstat.Value += amount
teamScoreChangedBindable:Fire(team, teamPoints)
end
結果を表示
プレイヤーが互いにタグを付け、チームのためにポイントを獲得し、 ServerScriptService > ゲームプレイ > ラウンド > チェックして、チームがラウンドの目標を達成したかどうかを確認します
しかし、チームのスコアが TEAM_SCORE_LIMIT 変数に到達すると、スクリプトはプレイヤーの名前とチームの名前を持つ roundWinnerRemote イベントインスタンスを発行します。
ラウンド
-- スコアの後にラウンドが終了したかどうかをチェックしますlocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- 勝利チームを表示for _, player in Players:GetPlayers() do-- ラウンド終了時にプレイヤーが所属するチームを送信する-- プレイヤーのチームが削除されることになるため、クライアント-- 自分のチームをチェックすることはできませんroundWinnerRemote:FireClient(player, team, player.Team)end
各クライアントのスクリプトは、RoundResultsGuiSetup > RoundWinnerRemote イベントインスタンスをリスニングして、この 2> roundWinnerRemote2> イベントのインスタンスを以下のように構成できます:
- ラウンドの結果と、プレイヤーが勝利チームにいたかどうかを発表するユニークな StarterGui > RoundResultsGui UI 画面を表示します。
- 勝利または敗北のオーディオクリップをプレイ。
たとえば、勝利ポイントを決めたチームにプレイヤーがいる場合、ラウンドの結果に対する複数の形式のフィードバックを受信します。これは、勝利テキストを表示する形式の UI 画面、およびオミッションをプレイするオーディオクリップの形式です。反対に、勝利ポイントを決めていないプレイヤーの場合、勝
RoundResultsGui設定
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- チームが勝った場合、勝利を表示します!そうでない場合は、敗北を表示します...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
チームをリセット
同時に、 ServerScriptService > ゲームプレイ > ラウンド は、チームがラウンドの目標を達成したことを確認し、それぞれのプレイヤーに適切なUIディスプレイをトリガーします。これにより、ラウンドのプロセスが開始され、両チームがリセットされます。
同じロジックを使用して、スポーン場所を構成する、 ラウンド 、然後、 中立 のスポーン場所の 1> Class.SpawnLocation.Neutral|Neutral1> プロパティを設定して、プレイヤーがチームステータスを問わず
ラウンド
-- 誰もがロビーに送信されますplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
インターミッションを待つ 10 秒後、 ラウンド サーバースクリプトは、すべての人のスコアをリセットし、新しいチームに再びループを開始するようにスタートします。サーバー内のプレイヤーがないので、サンプルはこのサイクリッシュなラウンドプロセスを繰り返します。
プレイヤーがチームでマップにスポーンし、ラウンドを完了することができるようになったので、次のセクションでは、各ブラスターの動作の背後にあるスクリプトについて説明します。