Udon Voice Utilities (UVU)
什么是 UVU?
UdonVoiceUtils 是一系列脚本和预制件,可以实时修改播放器音频设置。
TL;DR(直接开始)
跳转到 安装章节 以开始使用...但我真的建议你阅读这里给出的信息:)
示例用例
- 通过例如“麦克风”来增加玩家的语音范围。
- 使用音频区域/房间分隔音源。
- 墙外隔音。
- 使站在其他玩家身后的玩家消音。
- 根据虚拟形象身高缩放语音范围。
- 为玩家语音和所有音频添加混响。
- 使用私人后台区域(complex stage setups)创建复杂的舞台设置。
- 当玩家面对您或您面对他们时聚焦玩家的声音。
- 利用语音通道为组队游戏划分玩家。
它被用在什么地方?
- Rackshaw 的 Drinking Night - 遮挡, 音频区
- ImLeXz 的 Midnight Rooftop - 遮挡, 方向性语音
- Avali ShatterDome 由 RadioFoxWin - 麦克风、PlayerAudioController 菜单
- Spookyghostboo 的 The Black Cat - 方向性语音
- owlboy 的 The Great Pub - 遮挡、方向性语音
- Toasterly 的 The Pool Parlor - 方向性语音, 音频区域
- 虚拟表演艺术剧院 DjembeDragon - 私人通道、音频区域、混响、观众/舞台音量控制
- ...
您可以通过在 Discord 上向 Guribo 发送消息或在此创建 ticket 来请求添加您的世界。 请提供以下信息或使用 GitHub 上的模板:
- 世界名称
- 世界 ID(可选,可用于在教程世界中放置房间)
- 要显示的姓名(如果应使用当前的 VRChat 名称,则为可选)
注意:我不接受非世界作者自己提交的世界。
开始
从 UdonVoiceUtils 1.0.0 开始,您可以通过 VRChat Creator Companion 将包添加到您的项目中 。
版本控制
本包使用 Semantic Version 进行版本控制。
使用的模式 主要/次要/补丁 分别表示:
- 主要版本:发生不兼容的 API 更改。
- 含义:更新备份后,根据需要检查并更新您的场景/脚本。
- 次要版本:以向后兼容的方式添加了新功能。
- 含义:更新后,检查并根据需要更新您的使用情况。
- 补丁版本:实施了向后兼容的错误修复。
- 含义:更新后删除您添加的潜在解决方法。
安装
- 将 VRChat World SDK 3.6 安装/添加到您的项目中。
- 将 CyanPlayerObjectPool 安装/添加到您的项目中:https://cyanlaser.github.io/CyanPlayerObjectPool/。
- 将 TLP UdonVoiceUtils 安装/添加到您的项目中:https://guribo.github.io/TLP/。
- 启动项目并打开场景
Packages/tlp.udonvoiceutils/Runtime/Scenes/Demo.unity
。 - 单击 Unity 中的 Play 按钮。
- 检查控制台中的任何错误(预计只有一个与 AudioListener 相关的错误)。
- 如果有任何问题,请查看下面的 故障排除 部分。
- 要设置您自己的世界,请从 基本场景设置 开始。
附注事项:
请按照 VRChat 创建的官方指南使用 VRChat 创作者助手(VRChat Creator Companion) 创建 Unity World 项目。
示例脚本和预制件可在Packages/tlp.udonvoiceutils/Runtime/Prefabs/Examples
中找到。请在创建您自己的世界前查看 Wiki 以获取有关 可用的组件、功能和预制件 的信息。它提到了限制和需要采取的措施 在将 UVU 集成到 VRChat 世界时考虑。
要查看(和听到)如何使用这些功能中的任何一个,请随时与朋友一起测试示例世界或访问 VRChat 中的公开版本 。
基本场景设置
-
在 Project 窗口的搜索窗口中,键入 “TLP_"
-
使用 Dropdown 菜单筛选搜索结果,选择:In Packages
-
从搜索结果中,将两个预制件添加到您的场景中:
- TLPLogger - 用于记录任何与 TLP 相关的内容(必须)
- TLP_PlayerAudioController - UVU 核心系统(必须)
- 如果您需要一个菜单,也可以使用预制件 TLP_PlayerAudioCompleteWithUi
-
基本设置现已完成,默认情况下对任何播放器都没有影响。
-
从这里开始,您可以修改全局设置或添加一些示例预制件并将它们连接到控制器以创建所需的内容。此外,您还可以创建自己的自定义解决方案,这些解决方案依赖于 UVU 的 音频覆盖功能。
从 BPAv0.8 转换为 UVU
请按顺序执行这些步骤,并在执行之前先阅读所有说明
-
备份您的项目并确保您可以恢复到备份版本而不至于破坏任何内容!
-
如果您有自定义覆盖值,请制作屏幕截图或复制项目,以便轻松设置 再次使用相同的值(请注意,遮挡值已更改)。
-
打开新的空场景。
-
从创作者助手导入最新版本。
-
检查导入后控制台是否有报错。这有助于诊断已发生的问题。
- 如果您收到错误:
(...) does not belong to a U# assembly, have you made a U# assembly definition for the assembly the script is a part of?
- 重新启动 Unity 编辑器,它们应该就会消失了。
- 如果您收到错误:
-
打开使用 BPAv0.8 的场景(Scene)。
-
检查控制台,很可能有如下消息:
[UdonSharp] Scene behaviour 'SyncedPlayers' needed UnityEngine.Object upgrade pass
这意味着升级是成功的。- 如果您看到错误
Can't remove AudioListener because AudioReverbFilter depends on it
,请忽略它,它是一个以让 Reverb 对声部起作用的小 “特性”。
-
如果存在类似
[UdonSharp] Empty UdonBehaviour found on (...)
的报错。
- 单击该消息可导航到导致这一报错的游戏对象。
- 找到空的 UdonBehaviours(Program Source 设置为
None
)。 - 删除这些 UdonBehaviour。
- 单击该消息可导航到导致这一报错的游戏对象。
-
将
Assets/TLP/UdonUtils/Prefabs/TLP_Logger.prefab
预制件添加到场景中。 -
找到
PlayerAudioController
,如果已解压缩,请将整个游戏对象替换为TLP_PlayerAudioController
预制件。 -
打开预制件的层次结构并导航到
Configurations
游戏对象。 -
进行您的更改,默认情况下,这些更改将应用于每个玩家对 和
LocalConfiguration
DefaultConfiguration
-
最痛的部分:
- 查看 层级窗口(Hierarchy)并检查每个
UVU
组件是否有未设置的变量 - 在测试过程中,我发现一些对例如
SyncedIntegerArray
在升级后为空。 - 如果这些变量是预制件的一部分,请右键单击它们并尝试
Revert
选项 (如果可用),否则, 从子游戏对象中选择相应的组件,或将整个游戏对象替换为UVU
预制件,然后重新设置它。 - 使用 ClientSim 测试您世界中的每个 AudioZone/-Room 并检查 错误控制台。
- 查看 层级窗口(Hierarchy)并检查每个
-
最后,有一些脚本不再以 UdonBehaviours 的形状存在,因此场景中可能会有一些空的 UdonBehaviours 。控制台将告诉您有关它们的信息。
- UdonMath
- UdonCommon
- UdonDebug 的 除非解压缩了任何预制件,否则它们应该在升级过程中自动删除。
- UdonMath
故障排除
安装后的错误
- 确保已将 Cyan.PlayerObjectPool 添加到您的项目中!
- 您可能更新了尚不兼容 UdonVoiceUtils 的 UdonUtils 版本。
- 通过 创作者助手 从项目中删除 UdonVoiceUtils 和 UdonUtils。
- 再仅添加 UdonVoiceUtils(这将为您安装最新的兼容版本的 UdonUtils)。
世界里有些东西不工作
- 始终使用 client sim 在 Unity 编辑器中进行游戏测试!
- 在控制台(Console)中检查是否有任何错误。
- 请注意,应该只有一个关于 AudioListener 的错误,这是预期的,也是设计使然的。
- 可以单击我的 TLP 包产生的错误,它们将突出显示场景层次结构中的游戏对象 这导致了。
- 永远从顶部的第一个报错开始处理!
- 阅读报错,它们通常会告诉您出了什么问题。
- 报错通常类似于
<Variable> is not set
- 检查该脚本并寻找提到的变量名称。
- 设置缺失的变量,通常需要设置的相关脚本是 prefab 的一部分。
- 有时,从干净的预制件重新开始是有意义的!
- 报错通常类似于
遮挡(Occlusion)不起作用
- 确保您的碰撞器位于
Environment
图层上! - 墙壁的两侧都必须有一个碰撞面才能在两个方向上工作!
- 当使用基本的 BoxColliders 时,就是这种情况。
疑问解答
是否可以使用 MeshColliders 进行遮挡?
可以的。
如何更改默认/全局激活设置?
- 导航到场景中的 PlayerAudioController 预制件。
- 在其中找到
Configurations/LocalConfiguration
游戏对象。 - 根据需要更改其设置(此游戏对象保存活动设置)。
- 使用菜单时:将相同的设置应用于
Configurations/DefaultConfiguration
游戏对象(这允许将 Global Settings 重置回特定的默认值)。