1 Pico空间音频渲染器¶
以下将阐述Pico空间音频渲染器(Pico Spatial Audio)在unity环境中的集成指南,请认真跟随所述操作。
检查 Pico Spatial Audio 引擎 Unity 包内容¶
- Plugins: 保存着各个硬件平台的引擎动态库,可根据unity实际运行的平台自行删除无用的动态库文件
- Prefabs:保存着一些工具prefab
- Samples:保存着若干样例场景,可点开试听空间化引擎
- Runtime:保存着引擎所需的C#源代码,其中需要Unity开发者关注的是如下文件,
- PXR_Audio_Spatializer_Context.cs
- PXR_Audio_Spatializer_AudioSource.cs
- PXR_Audio_Spatializer_AmbisonicSource.cs
- PXR_Audio_Spatializer_AudioListener.cs
- 另外还有一些辅助文件,请确保他们也存在:
- PXR_Audio_Spatializer_API.cs
- PXR_Audio_Spatializer_Types.cs
- 若你需要使用环境声学模拟引擎,请确保如下C# script都存在:
- PXR_Audio_Spatializer_SceneGeometry.cs
- PXR_Audio_Spatializer_SceneMaterial.cs
OK!你应该已经有了所有你需要的文件了。下面我们将阐述如何在Unity中接入Pico Spatial Audio引擎。我们将从简单的空间化开始讲起,过渡到实时环境声学模拟,最后说明如何渲染ambisonic 信号。
集成 Pico Spatial Audio 引擎(free field)¶
Free field场景即完全没有环境声学模拟的场景。在free field使用场景下,我们只需要如下3个文件即可:
- PXR_Audio_Spatializer_Context.cs
- PXR_Audio_Spatializer_AudioSource.cs
- PXR_Audio_Spatializer_AudioListener.cs
集成步骤如下:
- 打开unity,创建一个空白3D工程
- 安装Pico Spatial Audio渲染器插件到你的项目
- 解压缩PicoSpatialAudio.zip
- 支持以下三种安装方法
i . 将 PicoSpatialAudio 文件夹拷贝至你的Unity工程文件夹中,放置在Assets文件夹下
ii . 将 PicoSpatialAudio 文件夹拷贝至你的Unity工程文件夹中,放置在Packages文件夹下
iii . 在 unity package manager 中添加
- 点击窗口左上角的 + 号,从磁盘上安装
- 选择 PicoSpatialAudio 文件夹下的 package.json,双击导入
- 使用 Mac 的开发者们请注意:
i . 在 Mac 端,由于系统 Gatekeeper 机制的问题,你可能会看到这样的警告信息
这是由于系统错误阻止了我们的空间音频动态库的加载;当前,在看到这样的警告时,请暂时按照如下步骤绕过这个问题:
- 打开系统偏好设置,前往安全与隐私
- 请注意到窗口下方,系统提示已阻止使用”libPicoSpatializer.dylib“ 或者 “libPicoAmbisonicDecoder.dylib”。点击右侧的“仍然允许”按钮
- 如果还存在一开始的警告窗口,在这些窗口上点击“好”
- 请重启你的Unity工程,如Unity 以及 Mac 系统都不再报错了,证明Pico 空间音频 SDK已成功安装。
- 在场景中,创建一个空的游戏对象(game object)
- 在该game object上加上 PXR_Audio_Spatializer_Context.cs 组件(component)
- 在 PXR_Audio_Spatializer_Context.cs 组件上,可自行设置渲染质量,以获得最佳的质量/效率组合。
- 在场景中创建另一个game object,为了你之后视觉上看得更清楚,建议创建一个球
- 在球上加上 PXR_Audio_Spatializer_AudioSource.cs 组件(component)。一个Audio Source组件将被自动加入。
- 建议保持Unity AudioSource spatial blend的值为0;一个非0的spatial blend会导致一部分unity的空间化效果和Pico 空间音频渲染器共同作用,造成比物理现实更夸张的音量衰减和多普勒效应
- 找到场景中的audio listener存在于哪个game object上(应该在你的camera上),在该object上加上 PXR_Audio_Spatializer_AudioListener.cs 组件
结束了!至此你已经集成完成了Pico Spatial Audio 引擎。
现在,我们让 Pico Spatial Audio 引擎将我们的音频信号空间化
- 选取你想要的测试文件,并将其导入进你的Unity 工程
- 在你的声源object上,你可以看到一个Audio Source 组件。在他的AudioClip field里选取你刚刚导入Unity的音频文件
- 勾选AudioSource 组件上的 “Play On Awake” 以及 “Loop” 选项
- 点击play!你应该听到你的音频文件被空间化了。
集成 Pico Spatial Audio 引擎(环境声学模拟)¶
实时环境声学模拟是Pico 空间音频渲染器的重要功能模块,可以根据使用中的实际场景,实时计算并渲染出声源的声波传播至听者处所带来的反射声和混响。下面, 我们在上一章的基础上 ,带你接入环境声学模拟功能。
步骤如下:
- 在你的虚拟场景中,导入/构建你的环境建模
- 在你想参与模拟环境声学的环境模型对象上,加上PXR_Audio_Spatializer_SceneGeometry.cs组件。一个 PXR_Audio_Spatializer_SceneMaterial.cs 组件会被自动加上。
- 在PXR_Audio_Spatializer_SceneGeometry.cs中
- Include Children:用来设置该geometry描述的Mesh是否包含该game object的子对象
- Ignore Static:用来设置该geometry是否忽视静态mesh
- Visualize Mesh In Editor:在editor中,用白色线框显示与这个geometry相关联的game object. 该功能仅在editor中生效,不会影响 play mode 以及 build。
- 在PXR_Audio_Spatializer_SceneMaterial.cs中
- Absorption,Element 0 ~ 3:环境材质的吸收率。从element0 到element3为4个频段,由低到高。
- Scattering:环境材质的散射率。一个高散射率的环境,其反射声听上去会更像混响;而一个低散射率的环境,其反射声听上去会更像一个个独立的回声。
- Transmission:环境材质的透射率。透射率越高,穿过该几何形状的声音强度越大;反之则越弱。
- 你可以自行设计这些参数,也可以从material preset中选取我们准备好的预设,并且基于这些预设修改参数。
另外请注意:如果你的mesh是从外部导入Unity的话,请确认Read/Write Enabled选项被勾选了:
集成 Pico Spatial Audio 引擎(Ambisonic 渲染)¶
我们的引擎提供了解码一阶AmbiX格式的ambisonic信号的能力。在unity 中,使用方法如下。
- 打开unity工程的project settings -> Audio
- 在Ambisonic Decoder Plugin选项卡处,选择Pico Ambisonic Decoder
- 在工程中创建一个ambisonic渲染总线
- 在工程中创建一个Audio Mixer。为了方便表述,我们假设mixer的名字是“Ambisonic_bus”
- 单击Ambisonic_bus -> Master,右侧 Inspector 中出现通道条配置
- 单击Add Effect,添加Pico Ambisonic Renderer
- 在场景中创建一个game object,挂载 PXR_Audio_Spatializer_AmbisonicSource组件;一个Unity AudioSource会被自动引入
- 将 AudioSource 的 Output 设置为 Master(Ambisonic_bus)
至此,Ambisonic 声源回放配置完毕;我们来试听一下
- 在PicoSpatialAudio -> Sample -> audio 文件夹中,找到 loop_FOA_48k Audio Clip
- 把 loop_FOA_48k 拖拽到 AudioSource 的 AudioClip上
- 如你想使用其他AudioClip,请确保
i . 它是一阶AmbiX格式的
ii . 勾选该 AudioClip 的 “Ambisonic” 选项
- 勾选AudioSource 组件上的 “Play On Awake” 以及 “Loop” 选项
- 点击play。如果你使用的 AudioClip 是 loop_FOA_48k,你应该能听到一个电子乐声源按照如下轨迹运动着:
- 先顺时针绕着listener水平旋转一周
- 然后先上,再下垂直转一圈
集成 Pico Spatial Audio 引擎(工具函数)¶
我们在引擎中提供了一些对象的工具函数,方便你创建想要的声音场景。所有工具函数都可以实时调用。
PXR_Audio_Spatializer_AudioSource
- public void Resume()
- 恢复播放该audio source
- public void SetGainDB(float gainDB)
- 设置这个source的增益,单位是分贝 dB
- public void SetSize(float radius)
- 设置这个source的半径长度,单位是米
- public void Resume()
PXR_Audio_Spatializer_AmbisonicSource
- public void Resume()
- 恢复播放该audio source
- public void Resume()
PXR_Audio_Spatializer_Context
- public void SetRenderingQuality(PXR_Audio.Spatializer.RenderingMode quality)
- 设置引擎的渲染质量
- public void SetRenderingQuality(PXR_Audio.Spatializer.RenderingMode quality)
附录1:开发技巧¶
声源数量¶
- 由于环境声学模拟和渲染对CPU负载较大,在使用环境声学模拟时,请确保同时发声的声源数量在20个以下。我们会持续优化性能,提升可同时发声的声源数量。
当前环境声学模拟的局限以及规避方法¶
由于游戏中的场景场景可能较为复杂,直接往复杂场景上挂 PXR_Audio_Spatializer_SceneGeometry 组件可能会导致如下问题:
- 场景中,若listener身处一个闭塞的小角落,他可能会听不到场景中某些声源的环境反射声
- 场景中,若listener和source分处室内外,同时建筑的外墙形状又极其复杂,可能会使得listener听到不该听到的反射声(从室内传到室外,或者反过来)
解决方法有如下几种:
在想要反射声音的场景处,手动添加一些 Pico Sound Reflection Object(比如下图白色线框处)
- 你可以在Pico Spatial Audio -> Prefabs 文件夹中找到 Pico Sound Reflection Object
把场景的mesh分组成多个gameobject,只在室内的大型墙面上挂载 PXR_Audio_Spatializer_SceneGeometry 组件,而不要在过多的细节形状上挂载(比如桌椅、柱子等等)
在游戏流程上规避,不要让玩家可以进入到会出错的场景区域
我们会持续迭代我们的环境声学模拟算法,从而在未来发布的版本里简化/去除这些手工配置过程。
附录2:已知问题¶
- 在Mac OS上,当在Unity editor内运行 PicoSpatialAudio/Sample 文件夹内的样例场景,并按下键盘按钮时,可能会听到“滴滴滴”的Mac系统警告音效。这是一个已知的Unity bug,只能等Unity官方修复这个问题了。问题讨论可以移步此处:https://issuetracker.unity3d.com/issues/macos-funk-error-sound-plays-when-pressing-any-non-shortcut-key-in-play-mode