チームを作成することで、プレイヤーをグループに分け、最も多くのポイントを獲得する、または敵チームのメンバーよりも先にゴールを越えるといった共通の目標を達成するために競わせることができます。ファーストパーソンシューティングゲームでは、チームを作成することが特に重要であり、個々のプレイヤーのスキルセットを超えた複雑で協調的なゲームプレイ戦略を確立します。
サンプルレーザータグゲームを参考に、このチュートリアルのセクションでは、プレイヤーをチームに分ける方法を教え、以下のスクリプトガイダンスを含みます。
- Teamsサービスのデフォルト機能を使用して、プレイヤーを緑チームまたはピンクチームに割り当てる方法。
- プレイヤーが画面上やゲーム内のチームインジケーターを通じて味方と敵チームメンバーを区別できるようにする方法。
- プレイヤーが味方を攻撃してもペナルティを受けない、寛容なゲームプレイを可能にする方法。
このセクションを完了すると、プレイヤーが中立のロビーやチームスポーンゾーンにスポーンまたはリスポーンすることを可能にするスクリプト、ファーストパーソンフォースフィールドのビジュアルをカスタマイズする方法、サーバーとクライアントの両方からクライアント状態を処理する方法について学びます。

チームカラーの割り当て
サンプルレーザータグゲームは、Teamsサービスを基にして2つのチームを作成します。このサービスは、すぐに使えるチームソーティング機能を提供します。たとえば、追加のスクリプト作業なしで、サービスは以下のようなアクションを処理します。
- プレイヤーを各チームに均等にソートしてバランスを取る。
- リーダーボードでプレイヤーをそのチームの下にグループ化する。
- 3D空間でプレイヤーの名前を対応するチームカラーに色付けする。
- プレイヤーをそのチームだけがアクセスできる異なるスポーン位置にスポーンさせる。
このデフォルト機能により、サンプルはTeamsサービスを有効にし、異なるTeam.Colorプロパティ値を持つ2つの異なるTeamオブジェクトを使用して各チームを表現します。ミントはマップの一方の側に集まるチームを、カーネーションピンクはマップの反対側に集まるチームを表します。これらの特定の色は補色であり、互いに良く対比され、プレイヤーが周囲を簡単にスキャンし、建物内や他のプレイヤーとの位置を把握できるようにします。




Team.Colorプロパティの正確なBrickColor名を注意深く確認することが重要です。なぜなら、ゲーム内の多くのスクリプトでこの名前を使用してプレイヤーがチームに分かれるのを追跡し、ラウンド中にプレイヤーが敵プレイヤーをタグ付けすることでポイントを加算し、カスタムUI要素を更新するからです。たとえば、ラウンドが始まると、ReplicatedStorage ⟩ HUDGuiSetupはstartSyncingTeamColorとstartSyncingTeamPointsを必要とし、どちらもTeam.Colorを参照して各チームのユニークなアクションを実行します。
startSyncingTeamColorはTeam.Colorを参照し、プレイヤーのチームインジケーターの色とアイコンを画面の左下隅に割り当てることができます。


local function setPlayerTeamIcon(gui: ScreenGui)
for _, teamColorIcon in gui.PlayerDisplay.TeamIcons:GetChildren() do
local iconTeamColor = teamColorIcon:GetAttribute(GuiAttribute.teamColor)
teamColorIcon.Visible = localPlayer.TeamColor == iconTeamColor
end
end
local function startSyncingTeamColor(gui: ScreenGui)
setPlayerTeamIcon(gui)
localPlayer:GetPropertyChangedSignal("Team"):Connect(function()
setPlayerTeamIcon(gui)
end)
endチームインジケーターの表示
プレイヤーがチームに分けられると、どのチームに属しているかを迅速に判断し、味方と敵チームメンバーを区別できる必要があります。この能力は、ファーストパーソンシューティングゲームのゲームプレイにおいて、プレイヤーが戦闘ゾーンで迅速に戦略的な決定を下す必要があるため重要です。そうしないと、タグ付けされてラウンドを失うことになります。
成功を収めるために、サンプルレーザータグゲームは、画面上と3D空間の両方に複数のチームインジケーターを提供します。
- プレイヤーインジケーター – プレイヤーのチームカラーとアイコンを表示するカスタム画面上UI。
- チームインジケーター – プレイヤーのチームカラーを表示するカスタムゲーム内UI。
- リーダーボードインジケーター – プレイヤーをそのチームカラーの下にグループ化するデフォルトのTeamsサービスの画面上UI。
- 名前の色付け – プレイヤーの名前をそのチームカラーに色付けするデフォルトのTeamsサービスのゲーム内UI。




リーダーボードインジケーターや名前の色付けについては、チュートリアルの前のセクションからチームカラーを割り当てるだけで追加の作業は必要ありませんが、カスタムUIチームインジケーターは、インジケーターを表示し、敵のインジケーターが壁の後ろに隠れるのを防ぐために、より多くのプログラミング作業が必要です。カスタムUIの動作を制御するスクリプトの完全な説明や、各UI要素を実装する方法については、UIカリキュラムのプレイヤーインジケーターとチームインジケーターを参照してください。
フレンドリーファイアの無効化
一部のファーストパーソンシューティングゲームでは、自分の味方を攻撃したプレイヤーにペナルティを与えますが、サンプルレーザータグゲームではフレンドリーファイアを無効にすることで、より寛容なゲームプレイを可能にしています。このデザインの決定により、全員がチームスコアを増やすことができ、ゲームプレイの事故によって減少することはありません。
サンプルがこの機能をどのように実装しているかを理解するために、ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTaggedがタグ付けされたプレイヤーにダメージを与える方法を確認してください。サーバーがプレイヤーの攻撃と別のプレイヤーとの衝突を検出すると、onPlayerTagged関数を呼び出して、どのプレイヤーが攻撃を発射したのか、どのプレイヤーが攻撃を受けたのか、そしてブラスターの種類に応じてどれだけのダメージをプレイヤーの健康から取り除くべきかを理解します。
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)健康を減少させる前に、スクリプトはまず、タグ付けされたプレイヤーが攻撃を発射したプレイヤーと同じチームにいるかどうかを確認します。同じチームであれば、スクリプトは攻撃データを完全に無視します。
local character = playerTagged.Character
local isFriendly = playerBlasted.Team == playerTagged.Team
-- フレンドリーファイアを無効にする
if isFriendly then
return
endしかし、タグ付けされたプレイヤーが敵チームにいる場合、プレイヤーはブラスターの種類に応じた適切なダメージを受けます。さらに、プレイヤーが十分なダメージを受けてタグ付けされると、スクリプトは攻撃を発射したプレイヤーのチームにポイントを与えます。サンプルがポイントを追跡する方法についての詳細は、チュートリアルの後半でラウンドを追加するを参照してください。
local humanoid = character and character:FindFirstChild("Humanoid")
if humanoid and humanoid.Health > 0 then
local damage = math.min(damageAmount, humanoid.Health)
humanoid:TakeDamage(damage)
if humanoid.Health <= 0 then
Scoring.incrementScore(playerBlasted, 1)
end
end
end
return onPlayerTagged今すぐゲームをテストすると、すべてのプレイヤーがチームに関係なく、アリーナの反対側のスポーンゾーンでランダムにスポーンするため、各チームが隣接してスポーンすることになります。
この問題に対処するために、次のチュートリアルのセクションでは、特定のスポーン位置にチームスポーンを制限するカスタムロジック、プレイヤーがブラスターを選択した後にスポーンエリアを離れるときのクライアント状態の処理、健康がゼロに達したときにプレイヤーをスポーンゾーンまたはロビーエリアにリスポーンさせる方法について学びます。