ボイスチャットは、プレイヤーが互いに近づいたり離れたりするに従って、話しているプレイヤーの音量を調整することで、リアルなコミュニケーションを模擬するプロキシミティベースのチャット機能です。プレイヤーがマイクを使ってお互いに話すことを許可することで、彼らはあなたの体験の目的を達成するために、世界中でリアルタイムに社交し、戦略を立てることができます。
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 オブジェクトを作成して、各チームを表します。1つのチームには鮮やかな赤、もう1つのチームには鮮やかな青です。
スクリプトは次に、チームボイスチャット構成のセットアップに関する作業が行われる3つの関数を定義します:
- getUserIds - チーム内のすべてのプレイヤーのユーザーIDの配列を返します。
- getDevices - チーム内のすべてのプレイヤーの AudioDeviceInput オブジェクトの配列を返します。すべての AudioDeviceInput オブジェクトは、プレイヤーの物理マイクを表します。
- updateTeam - getUserIds からすべてのユーザーIDを取得し、getDevices から AudioDeviceInput オブジェクトを繰り返し、その Enum.AccessModifierType プロパティをAllowに設定し、各チーム内のユーザーIDがチームメイトのマイクからの音声を聞くことを許可します。その後、チームのユーザーIDで 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) -- every 15 secondstoggleMuteAll() -- either allow people to speak, or prevent them from speakingendコードの説明このスクリプトは、体験におけるすべてのプレイヤーを管理するために Players サービスを取得して、機能を参照できるようにします。次に、フラグ muteAll をfalseに設定し、次の toggleMuteAll 関数がボイスチャットのオン/オフを切り替えます。
toggleMuteAll 関数をレビューしましょう:
- それは Players.GetPlayers を使用して体験内のすべてのプレイヤーをループします。
- 各プレイヤーについて、そのプレイヤーが自分のデバイス上に AudioDeviceInput オブジェクト、つまり物理マイクを持っているかどうかを確認します。
- 持っている場合、関数はその AudioDeviceInput オブジェクトの Muted プロパティを muteAll の値に設定します。たとえば、muteAll がtrueの場合、プレイヤーのマイクは無効になり、muteAll がfalseの場合、プレイヤーのマイクは有効になります。
その後、スクリプトは無限ループに入り、15秒ごとにすべての AudioDeviceInput オブジェクトをミュートおよびミュート解除します。
体験をプレイテストして、プレイヤーが15秒のインターバルでボイスチャットを通じてお互いにのみ聞こえることを確認してください。