ボイスチャットは、プレイヤーが3D空間で互いに近づいたり離れたりする際に、話しているプレイヤーの音量を調整することでリアルなコミュニケーションをシミュレートする、近接ベースのチャット機能です。プレイヤーがマイクを使ってお互いに話すことを可能にすることで、彼らはリアルタイムで社交し、戦略を立てて、ゲームの目的を達成することができます。
Gingerbread Island - Voice Chat .rbxlファイルを参考にして、このチュートリアルでは、ボイスチャットのさまざまな形式をゲームプレイに組み込む方法を示します。以下のガイダンスを含みます:
- プレイヤーをチームに分け、チームメンバーとのみボイスチャットを使用できるようにする。
- プレイヤーがデバイスの特定のボタンを押している間、マイクを一時的にアクティブにすることを許可する。
- ボイスチャットが有効または無効になる時間帯を設定する。
以下のセクションをサンプルと一緒に確認しながら、各コードサンプルを調整して、自分のボイスチャットの要件により適したものにすることができます。
設定を構成する
チームチャット、プッシュトゥチャット、または時間ベースのチャットが適切に機能するためには、ボイスチャットを有効にし、3D環境内で音声を拾い、発信するために必要なオーディオオブジェクトを作成するために、ボイスチャットの設定を構成する必要があります。
プレイヤーがゲームに参加すると、ボイスチャットの設定は次のようになります:
- ボイスチャットの資格があるプレイヤーがマイクを使用できるようにします。
- 各ボイスチャットの資格があるPlayerオブジェクトの下にAudioDeviceInputオブジェクトを作成し、親にします。
- 各ボイスチャットの資格があるPlayer.Characterの下にAudioEmitterオブジェクトを作成し、親にします。
- Workspace.CurrentCameraの下にAudioListenerを作成し、親にします。
以下のセクションでは、これらの設定を使用した3つのユニークなボイスチャット構成について詳しく説明します。サンプルのGingerbread Island - Voice Chatプレースファイルに従いながら、Explorerウィンドウで対応する無効化されたスクリプトを有効にして、その動作をテストできます。各スクリプトが正しく機能することを確認するために、次の構成に進む前に、スクリプトを再度無効にすることを忘れないでください。

チームチャットを追加する
チームチャットは、同じチームのプレイヤーのみがゲーム内でお互いに話したり聞いたりできるボイスチャットの構成です。チームチャットをゲームプレイに統合することは、プレイヤーが協力して問題を解決するために戦略を立てる際に役立ちます。たとえば、敵チームの位置、リソース、任務に関する情報を調整する際に便利です。
サンプルのGingerbread Island - Voice Chatプレースファイルでチームボイスチャットを再現するには:
Explorerウィンドウで、ServerScriptServiceにScriptを挿入します。
スクリプトの名前をTeamChatに変更し、次のコードをスクリプトに貼り付けます:
local Teams = game:GetService("Teams")local Players = game:GetService("Players")local redTeam = Instance.new("Team", Teams)redTeam.TeamColor = BrickColor.new("Bright red")redTeam.AutoAssignable = trueredTeam.Name = "Red Team"local blueTeam = Instance.new("Team", Teams)blueTeam.TeamColor = BrickColor.new("Bright blue")blueTeam.AutoAssignable = trueblueTeam.Name = "Blue Team"local function getUserIds(team : Team) : {number}local userIds = {}for _, player : Player in team:GetPlayers() dotable.insert(userIds, player.UserId)endreturn userIdsendlocal function getDevices(team : Team) : {AudioDeviceInput}local devices = {}for _, player : Player in team:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueendtable.insert(devices, device)endreturn devicesendlocal function updateTeam(team : Team)local users = getUserIds(team)for _, device in getDevices(team) dodevice.AccessType = Enum.AccessModifierType.Allowdevice:SetUserIdAccessList(users)endendlocal function onDeviceAdded(device : AudioDeviceInput)local player : Player = device.Parentif player.Team thenupdateTeam(player.Team)endendlocal function onPlayerAdded(player : Player)local device = player:FindFirstChild("AudioDeviceInput")if device thenonDeviceAdded(device)endplayer.ChildAdded:Connect(function(child)if child.Name == "AudioDeviceInput" thenonDeviceAdded(child)endend)endupdateTeam(blueTeam)updateTeam(redTeam)for _, player in Players:GetPlayers() doonPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)blueTeam.PlayerAdded:Connect(function() updateTeam(blueTeam) end)blueTeam.PlayerRemoved:Connect(function() updateTeam(blueTeam) end)redTeam.PlayerAdded:Connect(function() updateTeam(redTeam) end)redTeam.PlayerRemoved:Connect(function() updateTeam(redTeam) end)コードの説明スクリプトは、プレイヤーがゲームに参加する際に、TeamsおよびPlayersサービスを取得して、プレイヤーをチームに分けるための機能を使用します。たとえば、追加のスクリプトなしで、Teamsサービスは次のようなアクションを処理します:
- プレイヤーを均等に各チームに分けてバランスを取る。
- リーダーボード上でプレイヤーをそのチームの下にグループ化する。
- 3D空間内でプレイヤーの名前を対応するチームカラーに色付けする。
このサービスを使用して、スクリプトは異なるColorプロパティ値を持つ2つの異なるTeamオブジェクトを作成し、それぞれのチームを表します:明るい赤のチームと明るい青のチームです。
スクリプトは次に、チームボイスチャット構成を設定するための主要な作業が行われる3つの関数を定義します:
- getUserIds - チーム内のすべてのプレイヤーのuserIDの配列を返します。
- getDevices - チーム内のすべてのプレイヤーのAudioDeviceInputオブジェクトの配列を返します。各AudioDeviceInputオブジェクトは、現実世界におけるプレイヤーの物理マイクを表します。
- updateTeam - getUserIdsからすべてのuserIDを取得し、getDevicesからのAudioDeviceInputオブジェクトを反復処理し、それらのEnum.AccessModifierTypeプロパティをAllowに設定して、各チームのuserIDのみがチームメンバーのマイクから聞こえるようにし、次にチームのuserIDでSetUserIdAccessListを更新します。
スクリプトの残りの部分は、これらの関数とイベントリスナーがどのように連携して機能するかを制御します:
- 新しいプレイヤーがゲームに参加すると、スクリプトはそのプレイヤーがマイクを持っているかどうかを確認し、チームを更新します。
- スクリプトが新しいAudioDeviceInputオブジェクトを検出すると、そのプレイヤーの赤または青のチームに対してupdateTeamを呼び出します。
- プレイヤーがゲームに参加したり離れたりする際に、スクリプトはPlayerAddedおよびPlayerRemovedイベントに接続して、各チームの設定を更新します。
友達と一緒にゲームをプレイテストして、各チームのチームメンバーがボイスチャットを通じてのみお互いを聞くことができることを確認します。
プッシュトゥチャットを追加する
プッシュトゥチャットは、プレイヤーがデバイスの特定のボタンを押している間のみ、ゲーム内でマイクをアクティブにできるボイスチャットの構成です。プッシュトゥチャットをゲームプレイに統合することは、プレイヤーが他のプレイヤーや周囲の音に対して自分の声を聞かせるタイミングをよりプライベートに制御できるようにするのに役立ちます。
サンプルのGingerbread Island - Voice Chatプレースファイルでプッシュトゥボイスチャットを再現するには:
Explorerウィンドウで、ReplicatedStorageにScriptを挿入します。
Propertiesウィンドウで、RunContextをClientに設定し、スクリプトがローカルプレイヤーのマイクのみを制御するようにします。
スクリプトの名前をPushToChatに変更し、次のコードをスクリプトに貼り付けます:
local Players = game:GetService("Players")local UserInputService = game:GetService("UserInputService")local audioIn: AudioDeviceInput = Players.LocalPlayer:WaitForChild("AudioDeviceInput")local pushToTalkKey = Enum.KeyCode.VaudioIn.Muted = trueUserInputService.InputBegan:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = falseendend)UserInputService.InputEnded:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = trueendend)コードの説明スクリプトは、次のものを取得することから始まります:
- ゲーム内のすべてのプレイヤーを参照するためのPlayersサービス。
- プレイヤーがデバイスのボタンを押したときにチェックするためのUserInputServiceサービス。
- ローカルプレイヤーのAudioDeviceInputオブジェクト、つまりデバイス上の物理マイク。
スクリプトは次に:
- プレイヤーがマイクに話すために押し続ける必要があるボタンとしてVキーを設定します。
- プレイヤーのマイクをミュートします。
スクリプトの残りの部分は、UserInputServiceからのInputBeganおよびInputEndedの2つのイベントリスナーを設定します。プレイヤーがVキーを押すと、InputBeganイベントがプレイヤーのマイクをミュート解除し、Vキーを放すと、InputEndedイベントが再びマイクをミュートします。
ゲームをプレイテストして、プレイヤーがVキーを押しているときにのみボイスチャットを通じてお互いを聞くことができることを確認します。
時間ベースのチャットを追加する
時間ベースのチャットは、プレイヤーが設定された時間内にのみお互いに話したり聞いたりできるボイスチャットの構成です。時間ベースのチャットをゲームプレイに統合することは、プレイヤーが特定のフェーズ、たとえばラウンドベースの議論やカットシーンの後に、どのようにコミュニケーションを取るかを慎重に計画する際に役立ちます。
サンプルのGingerbread Island - Voice Chatプレースファイルで時間ベースのボイスチャットを再現するには:
Explorerウィンドウで、ServerScriptServiceにScriptを挿入します。
スクリプトの名前をTimeBasedChatに変更し、次のコードをスクリプトに貼り付けます:
local Players = game:GetService("Players")local muteAll = falselocal function toggleMuteAll()muteAll = not muteAllfor _, player in Players:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueenddevice.Muted = muteAllendendwhile true dotask.wait(15) -- 15秒ごとtoggleMuteAll() -- プレイヤーが話すことを許可するか、話すことを防ぐendコードの説明このスクリプトは、ゲーム内のすべてのプレイヤーを管理するための機能を参照するためにPlayersサービスを取得することから始まります。次に、muteAllフラグをfalseに設定し、次のtoggleMuteAll関数がボイスチャットをオンとオフに切り替えるために使用します。
toggleMuteAll関数を見てみましょう:
- Players.GetPlayersを使用して、ゲーム内のすべてのプレイヤーをループ処理します。
- 各プレイヤーについて、AudioDeviceInputオブジェクト、つまりデバイス上の物理マイクを持っているかどうかを確認します。
- もし持っていれば、関数はAudioDeviceInputオブジェクトのMutedプロパティをmuteAllの値に設定します。たとえば、muteAllがtrueの場合、プレイヤーのマイクは無効になり、muteAllがfalseの場合、プレイヤーのマイクは有効になります。
スクリプトは無限ループに入り、15秒待機してすべてのAudioDeviceInputオブジェクトをミュートおよびミュート解除します。
ゲームをプレイテストして、プレイヤーが15秒ごとにボイスチャットを通じてお互いを聞くことができることを確認します。