语音聊天是一项功能,允许您与其他玩家进行实时的口头交流。它仅适用于支持最多100名玩家的场所。

启用语音聊天
对于所有经过验证的13岁及以上用户,语音聊天在所有最多100名玩家的新游戏中默认启用。要为现有游戏激活语音或为新游戏禁用语音:
- 在Studio中打开您的游戏。
- 打开文件 ⟩ 体验设置。
- 在窗口左侧导航到通信选项卡。
- 切换启用语音聊天到您想要的设置。
- 可选为了在您的游戏中促进玩家之间的更好沟通,切换启用 摄像头以允许符合条件的玩家通过他们的移动来动画化他们的角色。
- 发布该场所以保存更改。
通过启用此设置,符合条件的13岁及以上用户可以在任何支持该功能的游戏中选择加入语音聊天。启用语音聊天是使用语音转文本API所必需的。
设置最大玩家数
如果您之前将场所的最大玩家数设置为超过100,则需要将其减少以支持语音聊天。
- 在体验设置窗口的左侧导航中,选择场所。您游戏中的每个场所都会显示。
- 点击超过100名玩家的场所旁边的**⋯按钮,然后选择配置场所**。
- 在最大玩家字段中,输入小于或等于100的任何数字。
- 点击保存按钮,然后发布以保存更改。
当您将场所的最大玩家数更新为少于100时,可能会有服务器已经配置为不同的、更高的数字。由于这些服务器不支持语音聊天,建议重启服务器。
自定义语音行为
语音聊天默认是基于距离的,根据参与者之间的距离调整音量。然而,您可以将UseAudioApi设置为Enabled以控制游戏中语音的设置和使用方式。
如果VoiceChatService尚未出现:
在资源管理器窗口中右键单击并从上下文菜单中选择显示 服务…。
在弹出窗口中选择VoiceChatService并点击插入。该服务将出现在资源管理器层级中。

选择VoiceChatService后,确保在属性窗口中将UseAudioApi设置为Enabled。这可能已经为您完成。
基于团队
要实现仅允许队友彼此听到的Team基础聊天,您可以在ServerScriptService中使用以下Script:
local Teams = game:GetService("Teams")
local function findAudioInput(forPlayer : Player) : AudioDeviceInput?
-- 假设每个玩家只有一个AudioDeviceInput,父级为Player对象
-- 如果VoiceChatService.EnableDefaultVoice为true,则为您提供此功能
-- 如果您的场所将AudioDeviceInput对象放在其他地方,可能需要重新设计以适应通用性
return forPlayer:FindFirstChildWhichIsA("AudioDeviceInput")
end
local function onTeamChanged(player : Player)
local team = player.Team
if not team then return end
local device = findAudioInput(player)
if not device then return end
-- 仅允许队友彼此听到
device.AccessType = Enum.AccessModifierType.Allow
local allowed = {}
for _, player : Player in team:GetPlayers() do
table.insert(allowed, player.UserId)
end
device:SetUserIdAccessList(allowed)
end
local function onTeamAdded(team : Team)
team.PlayerAdded:Connect(onTeamChanged)
team.PlayerRemoved:Connect(onTeamChanged)
end
for _, team : Team in Teams:GetTeams() do
onTeamAdded(team)
end
Teams.ChildAdded:Connect(function(child : Instance)
if child:IsA("Team") then
onTeamAdded(child)
end
end)非空间
根据您游戏的需求,听到其他人的声音可能更合理,无论他们的地理位置如何。如果您禁用默认语音聊天,则可以通过以下Script在ServerScriptService中实现非空间语音聊天:
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local function wireUp(source : Instance, target : Instance)
local wire = Instance.new("Wire")
wire.SourceInstance = source
wire.TargetInstance = target
wire.Parent = source
end
-- 为每个人的声音设置一个全局音量滑块
local volumeSlider = Instance.new("AudioFader", Workspace)
local output = Instance.new("AudioDeviceOutput", Workspace)
wireUp(volumeSlider, output)
local function onPlayerAdded(player : Player)
local device = Instance.new("AudioDeviceInput", player)
device.Player = player
-- 将每个新玩家的麦克风输入路由到全局音量滑块
wireUp(device, volumeSlider)
end
for _, player in Players:GetPlayers() do
onPlayerAdded(player)
end
Players.PlayerAdded:Connect(onPlayerAdded)local Players = game:GetService("Players")
local player = Players.LocalPlayer
local function onDescendantAdded(descendant : Instance)
if descendant:IsA("Wire") then
descendant:Destroy()
end
end
for _, descendant in player:GetDescendants() do
onDescendantAdded(descendant)
end
player.DescendantAdded:Connect(onDescendantAdded)按场所禁用
如果您不想为游戏中的每个场所启用语音聊天,可以在特定的本应符合语音条件的场所中禁用它。
要在游戏中的特定场所禁用语音聊天:
在资源管理器窗口中右键单击并从上下文菜单中选择显示 服务…。
在弹出窗口中选择VoiceChatService并点击插入。该服务将出现在资源管理器层级中。

选择VoiceChatService后,在属性窗口中禁用EnableDefaultVoice。
发布该场所以保存更改,并重启服务器以确保更改在当前运行您游戏的所有服务器上生效。
检查状态
您可以通过在LocalScript中调用IsVoiceEnabledForUserIdAsync(),或在Script中将RunContext设置为Enum.RunContext.Client来检查玩家是否启用了语音聊天。
local Players = game:GetService("Players")
local VoiceChatService = game:GetService("VoiceChatService")
local localPlayer = Players.LocalPlayer
local success, enabled = pcall(function()
return VoiceChatService:IsVoiceEnabledForUserIdAsync(localPlayer.UserId)
end)
if success and enabled then
print("语音聊天已启用!")
end