チームを作成することで、プレイヤーを共通の目標を達成するために競うグループに分類できます。例えば、最も多くのポイントを獲得するためや、他の敵チームメンバーよりも先にゴールを越えることなどです。ファーストパーソンシューターにおいては、チームを作成することが特に重要であり、これは個々のプレイヤーのスキルの枠を超えた複雑で連携の取れたゲームプレイ戦略を確立します。
サンプルレーザータグ体験を参考に、このチュートリアルのセクションではプレイヤーをチームに分ける方法を学び、以下のスクリプトガイダンスについて説明します。
- Teamsサービスのデフォルト機能を使用して、プレイヤーを緑チームまたはピンクチームのいずれかに割り当てます。
- プレイヤーが味方と敵チームメンバーを区別できるように、画面上および体験内でのチームインジケーターを提供します。
- チームメイトを撃つことでペナルティが適用されない、 forgiving なゲームプレイを実現します。
このセクションを完了すると、プレイヤーが中立ロビーまたはチームスポーンゾーンにスポーンまたはリスポーンし、ファーストパーソンフォースフィールドのビジュアルをカスタマイズし、サーバーおよびクライアントの両方からクライアント状態を処理するためのスクリプトについて学びます。

チームカラーの割り当て
サンプルレーザータグ体験では、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.Characterlocal isFriendly = playerBlasted.Team == playerTagged.Team-- フレンドリーファイアを無効化if isFriendly thenreturnend
ただし、タグ付けされたプレイヤーが敵チームに属する場合、プレイヤーは弾の種類に応じた適切なダメージを受けます。また、プレイヤーがタグ付けされるのに十分なダメージを受けた場合、このスクリプトは弾を撃ったプレイヤーのチームにポイントを与えます。サンプルがどのようにポイントを追跡するかについての詳細は、後のチュートリアルであるラウンドの追加を参照してください。
local humanoid = character and character:FindFirstChild("Humanoid")if humanoid and humanoid.Health > 0 thenlocal damage = math.min(damageAmount, humanoid.Health)humanoid:TakeDamage(damage)if humanoid.Health <= 0 thenScoring.incrementScore(playerBlasted, 1)endendendreturn onPlayerTagged
もし今すぐ体験をテストすれば、すべてのプレイヤーが無差別に対角線上のスポーンゾーンでスポーンするため、各チームが隣接してスポーンすることになります。この問題を解決するために、次のセクションでは、特定のスポーン地点にチームスポーンを制限し、プレイヤーがブラスターを選択後にスポーンエリアを移動する際のクライアント状態を扱い、プレイヤーの健康がゼロに達したときに元のスポーンゾーンまたはロビーエリアにリスポーンさせるカスタムロジックについて教えます。