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

时间:2015-07-29 12:19:22

标签: ios xcode swift audio scenekit

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

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

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

不幸的是,我找不到播放功能。 令我恼火的是,SCNAudioPlayer在添加到节点时会自动播放声音。但我想设置我的整个场景,没有播放任何声音,然后在稍后的时间播放声音。

使用SceneKit音频引擎的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

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

SCNAudioPlayers由引擎回收,因此您无需担心其使用寿命,除非您需要在他们正在播放时对其进行修改。 SceneKit音频引擎背后的想法是声音应该与SCNNodes的行为相同。如果一个节点在场景图中,那么它是可见的,它的几何形状,粒子系统等也是可见的。因此,如果声音附加到一个节点,它应该立即开始播放,如果该节点是可见的(如果它被隐藏则停止) )。

音频源仅代表实际的音频数据。将其视为纹理:它被加载一次,并且可以被许多3d节点上的许多材料引用。 音频播放器实例化音频源,以便您可以同时在多个节点上播放它,就像您在不同节点上使用相同的材​​料用于不同的几何形状一样。

希望这有助于并对设计选择提供一些看法,

S上。

答案 1 :(得分:4)

用于播放单个声音为/如果被事件和/或输入击中或以其他方式发起......

有一个特殊的"动作":SCNAction.playAudioSource

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

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

myNode.runAction(myActionName)