始める
中級者向けチュートリアル

ボイスチャットを追加する

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

ボイスチャットは、プレイヤーが互いに近づいたり離れたりするに従って、話しているプレイヤーの音量を調整することで、リアルなコミュニケーションを模擬するプロキシミティベースのチャット機能です。プレイヤーがマイクを使ってお互いに話すことを許可することで、彼らはあなたの体験の目的を達成するために、世界中でリアルタイムに社交し、戦略を立てることができます。

Gingerbread Island - Voice Chat .rbxl ファイルを参考にして、このチュートリアルでは、以下のガイダンスを含むさまざまな形式のボイスチャットをゲームプレイに組み込む方法を示します。

  • プレイヤーをチームに分け、チームメイトとのボイスチャットのみを使用できるようにする。
  • 特定のボタンを押している間、一時的にマイクを有効にする。
  • ボイスチャットが有効または無効になる時間を設定する。

以下のセクションをサンプルと共に確認しながら、各コードサンプルを自分のボイスチャットの要件に合わせて調整できます。

設定を構成する

チームチャット、プッシュトゥチャット、または時間ベースのチャットを適切に機能させるためには、ボイスチャットを有効にして、3D環境内で音声を取得および発信するために必要な適切なオーディオオブジェクトを作成するために、ボイスチャット設定を構成する必要があります。

プレイヤーがあなたの体験に参加すると、あなたのボイスチャット設定は次のようになります:

以下のセクションでは、これらの設定を使用した3つのユニークなボイスチャット構成を詳述します。サンプルの Gingerbread Island - Voice Chat プレースファイルを参照しながら、Explorer ウィンドウで該当する無効なスクリプトを有効にしてその動作をテストできます。それぞれが正常に動作することを確認するために、別の構成に進む前にスクリプトを無効に戻すことを必ず行ってください

Explorerウィンドウにおける無効なスクリプト

チームチャットを追加する

チームチャットは、同じチームのプレイヤーだけが発言したり、互いに聞いたりできるボイスチャットの構成です。チームチャットをゲームプレイに統合することは、プレイヤーが体験内の問題を解決するために協力し、戦略を立てる必要があるときに便利です。例えば、敵チームの位置、リソース、および任務に関する情報を調整する場合などです。

サンプルの Gingerbread Island - Voice Chat プレースファイルでチームボイスチャットを再現するには:

  1. Explorer ウィンドウで、ServerScriptServiceScript を挿入します。

  2. スクリプトの名前を 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 = true
    redTeam.Name = "Red Team"
    local blueTeam = Instance.new("Team", Teams)
    blueTeam.TeamColor = BrickColor.new("Bright blue")
    blueTeam.AutoAssignable = true
    blueTeam.Name = "Blue Team"
    local function getUserIds(team : Team) : {number}
    local userIds = {}
    for _, player : Player in team:GetPlayers() do
    table.insert(userIds, player.UserId)
    end
    return userIds
    end
    local function getDevices(team : Team) : {AudioDeviceInput}
    local devices = {}
    for _, player : Player in team:GetPlayers() do
    local device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")
    if not device then
    continue
    end
    table.insert(devices, device)
    end
    return devices
    end
    local function updateTeam(team : Team)
    local users = getUserIds(team)
    for _, device in getDevices(team) do
    device.AccessType = Enum.AccessModifierType.Allow
    device:SetUserIdAccessList(users)
    end
    end
    local function onDeviceAdded(device : AudioDeviceInput)
    local player : Player = device.Parent
    if player.Team then
    updateTeam(player.Team)
    end
    end
    local function onPlayerAdded(player : Player)
    local device = player:FindFirstChild("AudioDeviceInput")
    if device then
    onDeviceAdded(device)
    end
    player.ChildAdded:Connect(function(child)
    if child.Name == "AudioDeviceInput" then
    onDeviceAdded(child)
    end
    end)
    end
    updateTeam(blueTeam)
    updateTeam(redTeam)
    for _, player in Players:GetPlayers() do
    onPlayerAdded(player)
    end
    Players.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)

    スクリプトは最初に TeamsPlayers サービスを取得して、プレイヤーが体験に参加する際にチームに分けるためにその機能を利用します。たとえば、追加のスクリプトがなくても、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 イベントに接続して、各チームの設定を更新します。
  3. 友達と体験をプレイテストして、各チームのチームメイトがボイスチャットを通じてのみお互いに聞けることを確認してください。

プッシュトゥチャットを追加する

プッシュトゥチャットは、プレイヤーが体験内で特定のボタンを押している間のみマイクをアクティブにできるボイスチャットの構成です。プレイヤーが他のプレイヤーや周囲の雑音に対して、声を聞いてもらうタイミングをよりプライベートかつコントロールできるようにしたい場合に、プッシュトゥチャットをゲームプレイに統合することが便利です。

サンプルの Gingerbread Island - Voice Chat プレースファイルでプッシュトゥボイスチャットを再現するには:

  1. Explorer ウィンドウで、ReplicatedStorageScript を挿入します。

  2. Properties ウィンドウで、RunContextClient に設定し、スクリプトがローカルプレイヤーのマイクのみを制御するようにします。

  3. スクリプトの名前を PushToChat に変更し、次のコードをスクリプトに貼り付けます:


    local Players = game:GetService("Players")
    local UserInputService = game:GetService("UserInputService")
    local audioIn: AudioDeviceInput = Players.LocalPlayer:WaitForChild("AudioDeviceInput")
    local pushToTalkKey = Enum.KeyCode.V
    audioIn.Muted = true
    UserInputService.InputBegan:Connect(function(input: InputObject)
    if input.KeyCode == pushToTalkKey then
    audioIn.Muted = false
    end
    end)
    UserInputService.InputEnded:Connect(function(input: InputObject)
    if input.KeyCode == pushToTalkKey then
    audioIn.Muted = true
    end
    end)

    スクリプトは最初に次のものを取得します:

    • 体験内のすべてのプレイヤーを参照するための Players サービス。
    • プレイヤーがデバイス上のボタンを押すときにチェックするための UserInputService サービス。
    • ローカルプレイヤーの AudioDeviceInput オブジェクト、つまりデバイス上の物理マイク。

    スクリプトは次に:

    • プレイヤーがマイクで話すために押し続ける必要のあるボタンとして V キーを設定します。
    • プレイヤーのマイクをミュートします。

    残りのスクリプトは、UserInputServiceInputBeganInputEnded に対して2つのイベントリスナーを設定します。プレイヤーが V キーを押すと、InputBegan イベントがプレイヤーのマイクのミュートを解除し、V キーを離すと、InputEnded イベントが再びマイクをミュートにします。

  4. 体験をプレイテストして、プレイヤーが V キーを押している間のみボイスチャットを通じてお互いに聞けることを確認してください。

時間ベースのチャットを追加する

時間ベースのチャットは、プレイヤーが設定された時間の間だけお互いに話したり聞いたりできるボイスチャットの構成です。時間ベースのチャットをゲームプレイに統合することは、プレイヤーが特定のフェーズでお互いにコミュニケーションを取る方法を慎重に計画したい場合に便利です。例えば、ラウンドベースのディスカッションやカットシーンの後などです。

サンプルの Gingerbread Island - Voice Chat プレースファイルで時間ベースのボイスチャットを再現するには:

  1. Explorer ウィンドウで、ServerScriptServiceScript を挿入します。

  2. スクリプトの名前を TimeBasedChat に変更し、次のコードをスクリプトに貼り付けます:


    local Players = game:GetService("Players")
    local muteAll = false
    local function toggleMuteAll()
    muteAll = not muteAll
    for _, player in Players:GetPlayers() do
    local device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")
    if not device then
    continue
    end
    device.Muted = muteAll
    end
    end
    while true do
    task.wait(15) -- every 15 seconds
    toggleMuteAll() -- either allow people to speak, or prevent them from speaking
    end

    このスクリプトは、体験におけるすべてのプレイヤーを管理するために Players サービスを取得して、機能を参照できるようにします。次に、フラグ muteAllfalseに設定し、次の toggleMuteAll 関数がボイスチャットのオン/オフを切り替えます。

    toggleMuteAll 関数をレビューしましょう:

    • それは Players.GetPlayers を使用して体験内のすべてのプレイヤーをループします。
    • 各プレイヤーについて、そのプレイヤーが自分のデバイス上に AudioDeviceInput オブジェクト、つまり物理マイクを持っているかどうかを確認します。
    • 持っている場合、関数はその AudioDeviceInput オブジェクトの Muted プロパティを muteAll の値に設定します。たとえば、muteAlltrueの場合、プレイヤーのマイクは無効になり、muteAllfalseの場合、プレイヤーのマイクは有効になります。

    その後、スクリプトは無限ループに入り、15秒ごとにすべての AudioDeviceInput オブジェクトをミュートおよびミュート解除します。

  3. 体験をプレイテストして、プレイヤーが15秒のインターバルでボイスチャットを通じてお互いにのみ聞こえることを確認してください。

©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。