立即開始
中級教學

添加語音聊天

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

語音聊天 是一種基於距離的聊天功能,透過調整說話玩家的音量,模擬現實中的溝通,當他們在 3D 空間中互相靠近或遠離時。讓玩家使用自己的麥克風互相交談,使他們能夠在全球範圍內即時社交和策劃,以完成您的體驗目標。

本教程以 Gingerbread Island - Voice Chat .rbxl 檔案為參考,向您展示如何將不同形式的語音聊天整合到您的遊戲中,並包括以下指導:

  • 將玩家排序為只能與隊友進行語音聊天的團隊。
  • 讓玩家在按下設備上的特定按鈕時暫時啟用他們的麥克風。
  • 配置語音聊天啟用或禁用的時間段。

在您檢閱以下部分的同時,可以根據自己的語音聊天需求調整每一段代碼範例。

配置設置

為使團隊聊天、推按聊天或基於時間的聊天正常運作,您必須 配置您的語音聊天設置,以啟用語音聊天並創建必要的音頻對象,以便在 3D 環境中拾取和發出音頻。

當玩家加入您的體驗時,您的語音聊天設置將:

以下部分詳細介紹使用這些設置的三種獨特語音聊天配置。當您按照範例 Gingerbread Island - Voice Chat 場地檔案進行操作時,可以在 Explorer 窗口中啟用對應的禁用腳本來測試它們的行為。為確保其正常運作,在進入下一個配置之前,請務必再次禁用該腳本

Explorer 窗口中的禁用腳本

添加團隊聊天

團隊聊天 是一種語音聊天配置,只有同一團隊的玩家才能在體驗中進行交談或彼此聽見。將團隊聊天整合到您的遊戲中非常有用,當您希望玩家合作並一起策劃解決在體驗中出現的問題,例如協調敵隊位置、資源和任務的信息。

要在範例 Gingerbread Island - Voice Chat 場地檔案中重新創建團隊語音聊天:

  1. Explorer 窗口中,將 Script 插入到 ServerScriptService

  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 空間中著色為其相應的團隊顏色。

    使用此服務,腳本創建了兩個不同的 Team 對象,並為每個團隊設置不同的 Color 屬性值:明亮的紅色明亮的藍色

    然後,腳本定義了三個函數,這是設置團隊語音聊天配置的主要工作所在:

    • getUserIds - 返回團隊中所有玩家的 userIDs 陣列。
    • getDevices - 返回團隊中所有玩家的 AudioDeviceInput 對象陣列。每個 AudioDeviceInput 對象代表玩家在現實世界中的 實體麥克風
    • updateTeam - 從 getUserIds 獲取所有 userIDs,遍歷 getDevices 中的 AudioDeviceInput 對象,將它們的 Enum.AccessModifierType 屬性設置為 Allow,以便每個團隊中的 userIDs 僅能聽到其隊友的麥克風聲音,然後用來自團隊的 userIDs 更新 SetUserIdAccessList

    腳本的其餘部分控制這些函數和事件監聽器是如何協同工作的:

    • 當新玩家加入體驗時,腳本驗證該玩家是否有麥克風並更新其團隊。
    • 當腳本檢測到新的 AudioDeviceInput 對象時,會對其相應的紅色或藍色團隊調用 updateTeam
    • 隨著玩家的加入或離開,腳本連接到 PlayerAddedPlayerRemoved 事件,以更新每個團隊的設置。
  3. 與幾位朋友進行遊玩測試,以驗證來自每個團隊的隊友是否只能通過語音聊天聽見彼此。

添加推按聊天

推按聊天 是一種語音聊天配置,玩家僅能在按住設備上的特定按鈕時在體驗中啟用麥克風。將推按聊天整合到您的遊戲中非常有用,當您希望玩家在想要被其他玩家和環境噪音聽見時,有更多隱私和控制權。

要在範例 Gingerbread Island - Voice Chat 場地檔案中重新創建推按語音聊天:

  1. Explorer 窗口中,將 Script 插入到 ReplicatedStorage

  2. Properties 窗口中,將 RunContext 設置為 Client,以使腳本僅控制本地玩家的麥克風。

  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 鍵設置為玩家需要按住的按鈕,以便能講話進入麥克風。
    • 將玩家的麥克風靜音。

    腳本的其餘部分為 UserInputService 設置了兩個事件監聽器,分別是 InputBeganInputEnded。當他們按下 V 鍵時,InputBegan 事件將取消靜音玩家的麥克風,而當他們放開 V 鍵時,InputEnded 事件將再次靜音他們的麥克風。

  4. 進行遊玩測試,以確認玩家只有在按下 V 鍵時才能通過語音聊天聽見彼此。

添加基於時間的聊天

基於時間的聊天 是一種語音聊天配置,玩家僅能在設置的時間段內交談和聽見彼此。將基於時間的聊天整合到您的遊戲中非常有用,當您希望玩家在特定階段(例如回合制討論或過場動畫後)謹慎規劃彼此之間的交流。

要在範例 Gingerbread Island - Voice Chat 場地檔案中重新創建基於時間的語音聊天:

  1. Explorer 窗口中,將 Script 插入到 ServerScriptService

  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) -- 每 15 秒
    toggleMuteAll() -- 要麼允許人們發言,要麼防止他們發言
    end

    該腳本首先獲取 Players 服務,以便引用其功能來管理體驗中的所有玩家。然後,它將旗標 muteAll 設置為 false,這個標誌將在隨後的 toggleMuteAll 函數中用於切換語音聊天的開關。

    讓我們來看看 toggleMuteAll 函數:

    • 它首先使用 Players.GetPlayers 獲取體驗中所有玩家的循環。
    • 對於每個玩家,它檢查是否有一個名為 AudioDeviceInput 的子對象,或設備上的物理麥克風。
    • 如果有,該函數將 AudioDeviceInput 對象的 Muted 屬性設置為 muteAll 的值。例如,當 muteAlltrue 時,玩家的麥克風將被禁用;當 muteAllfalse 時,玩家的麥克風將被啟用。

    然後,腳本進入無限循環,每 15 秒靜音和取消靜音所有 AudioDeviceInput 對象。

  3. 進行遊玩測試,以確認玩家僅能在每 15 秒的增量中通過語音聊天聽見彼此。

©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。