語音聊天 是一種基於距離的聊天功能,透過調整說話玩家的音量,模擬現實中的溝通,當他們在 3D 空間中互相靠近或遠離時。讓玩家使用自己的麥克風互相交談,使他們能夠在全球範圍內即時社交和策劃,以完成您的體驗目標。
本教程以 Gingerbread Island - Voice Chat .rbxl 檔案為參考,向您展示如何將不同形式的語音聊天整合到您的遊戲中,並包括以下指導:
- 將玩家排序為只能與隊友進行語音聊天的團隊。
- 讓玩家在按下設備上的特定按鈕時暫時啟用他們的麥克風。
- 配置語音聊天啟用或禁用的時間段。
在您檢閱以下部分的同時,可以根據自己的語音聊天需求調整每一段代碼範例。
配置設置
為使團隊聊天、推按聊天或基於時間的聊天正常運作,您必須 配置您的語音聊天設置,以啟用語音聊天並創建必要的音頻對象,以便在 3D 環境中拾取和發出音頻。
當玩家加入您的體驗時,您的語音聊天設置將:
- 允許符合語音聊天條件的玩家使用他們的麥克風。
- 在每個符合語音聊天條件的 Player 對象下創建並附加一個 AudioDeviceInput 對象。
- 在每個符合語音聊天條件的 Player.Character 下創建並附加一個 AudioEmitter 對象。
- 在 Workspace.CurrentCamera 下創建並附加一個 AudioListener 。
以下部分詳細介紹使用這些設置的三種獨特語音聊天配置。當您按照範例 Gingerbread Island - Voice Chat 場地檔案進行操作時,可以在 Explorer 窗口中啟用對應的禁用腳本來測試它們的行為。為確保其正常運作,在進入下一個配置之前,請務必再次禁用該腳本。

添加團隊聊天
團隊聊天 是一種語音聊天配置,只有同一團隊的玩家才能在體驗中進行交談或彼此聽見。將團隊聊天整合到您的遊戲中非常有用,當您希望玩家合作並一起策劃解決在體驗中出現的問題,例如協調敵隊位置、資源和任務的信息。
要在範例 Gingerbread Island - Voice Chat 場地檔案中重新創建團隊語音聊天:
在 Explorer 窗口中,將 Script 插入到 ServerScriptService。
將腳本重命名為 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 空間中著色為其相應的團隊顏色。
使用此服務,腳本創建了兩個不同的 Team 對象,並為每個團隊設置不同的 Color 屬性值:明亮的紅色和 明亮的藍色。
然後,腳本定義了三個函數,這是設置團隊語音聊天配置的主要工作所在:
- getUserIds - 返回團隊中所有玩家的 userIDs 陣列。
- updateTeam - 從 getUserIds 獲取所有 userIDs,遍歷 getDevices 中的 AudioDeviceInput 對象,將它們的 Enum.AccessModifierType 屬性設置為 Allow,以便每個團隊中的 userIDs 僅能聽到其隊友的麥克風聲音,然後用來自團隊的 userIDs 更新 SetUserIdAccessList 。
腳本的其餘部分控制這些函數和事件監聽器是如何協同工作的:
- 當新玩家加入體驗時,腳本驗證該玩家是否有麥克風並更新其團隊。
- 當腳本檢測到新的 AudioDeviceInput 對象時,會對其相應的紅色或藍色團隊調用 updateTeam。
- 隨著玩家的加入或離開,腳本連接到 PlayerAdded 和 PlayerRemoved 事件,以更新每個團隊的設置。
與幾位朋友進行遊玩測試,以驗證來自每個團隊的隊友是否只能通過語音聊天聽見彼此。
添加推按聊天
推按聊天 是一種語音聊天配置,玩家僅能在按住設備上的特定按鈕時在體驗中啟用麥克風。將推按聊天整合到您的遊戲中非常有用,當您希望玩家在想要被其他玩家和環境噪音聽見時,有更多隱私和控制權。
要在範例 Gingerbread Island - Voice Chat 場地檔案中重新創建推按語音聊天:
在 Explorer 窗口中,將 Script 插入到 ReplicatedStorage。
在 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。當他們按下 V 鍵時,InputBegan 事件將取消靜音玩家的麥克風,而當他們放開 V 鍵時,InputEnded 事件將再次靜音他們的麥克風。
進行遊玩測試,以確認玩家只有在按下 V 鍵時才能通過語音聊天聽見彼此。
添加基於時間的聊天
基於時間的聊天 是一種語音聊天配置,玩家僅能在設置的時間段內交談和聽見彼此。將基於時間的聊天整合到您的遊戲中非常有用,當您希望玩家在特定階段(例如回合制討論或過場動畫後)謹慎規劃彼此之間的交流。
要在範例 Gingerbread Island - Voice Chat 場地檔案中重新創建基於時間的語音聊天:
在 Explorer 窗口中,將 Script 插入到 ServerScriptService。
將腳本重命名為 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 秒的增量中通過語音聊天聽見彼此。