跳至正文
版本:bleeding-edge 🩸

语音通话(VOIP)

nanos world 中 VOIP 的工作原理以及如何使用它。

nanos world 使用 Steam 的原生实现提供了一个内置的语音通话 (VOIP) 系统,允许玩家在游戏内通过语音进行交流。该 VOIP 系统具有高度可定制性,可以配置为使用本地/近距离聊天、全局频道,或两者结合。

VOIP 音频类型​

VOIP 系统基于两种主要类型:本地/近距离 与 全局。

本地/近距离​

本地 VOIP 使用 3D 空间化音频输出玩家的声音。通常,这会附着在占有该玩家的角色上,并模拟出一个真实的音频环境,玩家只有在彼此靠近时才能听到对方说话。

你可以使用 Player:SetVOIPLocalSetting() 来为玩家启用或禁用本地聊天。可以使用 Player:SetVOIPLocalVolume() 调整本地语音的音量,并使用 Player:SetVOIPLocalMaxDistance() 调整声音能被听到的最远距离。

全局​

全局 VOIP 允许玩家相互交流,无论他们处于游戏世界中的哪个位置。共有 63 个可用的全局频道(1-63)。可以配置玩家在特定频道上进行收听或发言。

你可以使用 Player:SetVOIPGlobalChannelSetting() 为特定全局频道配置玩家设置,或者使用 Player:SetVOIPGlobalAllChannelsSetting() 一次性配置所有频道。全局聊天的音量同样可以通过 Player:SetVOIPGlobalVolume() 进行调整。

你可以使用 Player:GetVOIPListeningChannels() 和 Player:GetVOIPSpeakingChannels() 检查玩家正在哪些频道中收听或说话。

Server/Index.lua
-- 创建一个“队伍无线电”:每个队伍的玩家仅在其队伍频道中说话和收听
function SetPlayerTeamRadio(player, team)
-- 停止在所有全局频道中收听和说话
player:SetVOIPGlobalAllChannelsSetting(VOIPSetting.None)

-- 在队伍频道中说话和收听(队伍 1 使用频道 1,依此类推)
player:SetVOIPGlobalChannelSetting(team, VOIPSetting.Both)
end

高通/低通滤波器​

在全局频道中,可以通过 Player:SetVOIPGlobalHighPassFilter() 和 Player:SetVOIPGlobalLowPassFilter() 方法对全局音频设置滤波器。

我们可以通过设置高通滤波器(例如 player:SetVOIPGlobalHighPassFilter(8000))来模拟出收音机效果。

备注

高通/低通滤波器仅在全局频道中可用。

VOIP 设置​

本地和全局频道的 VOIP 设置均是使用 VOIPSetting 枚举进行配置的。可以在本地频道以及每个全局频道上定义玩家是仅收听、仅说话还是两者兼有!

了解谁在说话​

当玩家开始或停止说话时会触发 VOIP 事件,这对于在 UI 中显示“正在讲话”指示器非常有用:

Client/Index.lua
Player.Subscribe("VOIP", function(player, is_talking)
Console.Log("%s is %s", player:GetName(), is_talking and "talking" or "silent")
end)

静音​

玩家可以通过两种相互独立的方式被静音。

被脚本静音: 可以使用 Player:SetVOIPMuted() 方法静音某个玩家。如果在服务器端调用,该玩家将对所有人静音(并且其游戏会停止发送语音),但也可以在客户端调用以进行本地静音。

被玩家自己静音: 玩家可以通过暂停菜单中的 静音 按钮静音自己的麦克风,或在自由麦模式下按 VOIP 按键。此静音属于玩家本人:脚本无法更改,但可以通过 Client.IsVOIPSelfMuted() 读取,并监听 VOIPSelfMuteChange 事件,例如在 UI 中显示静音图标:

Client/Index.lua
Client.Subscribe("VOIPSelfMuteChange", function(is_muted)
MyHUD:CallEvent("SetMicMuted", is_muted)
end)

玩家自己的静音状态在游戏打开期间会保留,即使切换服务器也是如此,但不会被保存。

按键说话与自由麦​

每个玩家在音频设置中选择其麦克风的工作方式:

  • 按键说话(默认):仅在玩家按住 VOIP 按键时发送语音。
  • 自由麦:除非玩家自己静音,否则始终发送语音。在此模式下,按 VOIP 按键可切换玩家自己的静音状态。

这是玩家偏好设置,脚本无法更改,但可以通过 Client.GetSettings() 使用 VoicePushToTalk 键读取,例如在 UI 中显示正确的提示。

配置麦克风​

由于我们使用了 Steam 的实现方式,你可以在 Steam 的设置中配置你的麦克风,该设置可以通过 Steam 客户端或 Shift+Tab 叠加界面快捷键进行访问。这允许你调节麦克风音量、测试麦克风并设置其他音频偏好设置。

Steam 语音设置