SceneKit Audio - 如何将 SCNPlayer 添加到 SCNNode 并播放声音

SceneKit Audio - How to add a SCNPlayer to a SCNNode and just play back a sound

我目前正在使用此代码(在 SCNNode 子类中)在 SceneKit 中播放声音。

    let audioSource = SCNAudioSource(named: "coin.wav")
    let audioPlayer = SCNAudioPlayer(source: audioSource)
    self.addAudioPlayer(audioPlayer)

这并不理想,因为每次我播放新声音时它都会填充 audioPlayers 数组。理想情况下,我可以为每个我想播放的声音使用一个 SCNAudioPlayer,然后调用 "play" 函数来播放它。

很遗憾,我找不到播放功能。 同样让我恼火的是,SCNAudioPlayer 在添加到节点时会自动播放声音。但是我想在不播放任何声音的情况下设置我的整个场景,然后在稍后的某个时间点播放声音。

SceneKit的Audio Engine的正确使用方法是什么?

用于播放单个声音 as/if 当被击中或以其他方式被事件 and/or 输入...

有个特别的"action":SCNAction.playAudioSource

class func playAudioSource(_ source: SCNAudioSource,
     waitForCompletion wait: Bool) -> SCNAction

然后,要播放声音,运行 它在节点上:

myNode.runAction(myActionName)

您可以使用之前回答的操作,因为它在语法上更易于使用。

SCNAudioPlayer 由引擎回收,因此您无需担心它们的寿命,除非您需要在播放时修改它们。 SceneKit 音频引擎背后的想法是声音应该以与 SCNNode 相同的方式运行。如果一个节点在场景图中,那么它是可见的,它的几何体、粒子系统等也是可见的。所以如果一个声音附加到一个节点,它应该在节点可见时立即开始播放(如果它是隐藏的则停止).

音源仅代表实际的音频数据。把它想象成一个纹理:它被加载一次,可以被多个 3d 节点上的多个 material 引用。 音频播放器实例化音频源,以便您可以同时在多个节点上播放它,就像您对不同节点上的不同几何体使用相同的 material 一样。

希望这对设计选择有所帮助并提供一些观点,

S.