我目前正在使用此代码(在SCNNode子类中)在SceneKit中播放声音。
let audioSource = SCNAudioSource(named: "coin.wav")
let audioPlayer = SCNAudioPlayer(source: audioSource)
self.addAudioPlayer(audioPlayer)
这并不理想,因为每次播放新声音时它都会填充audioPlayers数组。理想情况下,我可以为每个我想播放的声音设置一个SCNAudioPlayer,然后调用一个" play"发挥作用的功能。
不幸的是,我找不到播放功能。 令我恼火的是,SCNAudioPlayer在添加到节点时会自动播放声音。但我想设置我的整个场景,没有播放任何声音,然后在稍后的时间播放声音。
使用SceneKit音频引擎的正确方法是什么?
答案 0 :(得分:6)
您可以使用之前回答的操作,因为它在语法上更易于使用。
SCNAudioPlayers由引擎回收,因此您无需担心其使用寿命,除非您需要在他们正在播放时对其进行修改。 SceneKit音频引擎背后的想法是声音应该与SCNNodes的行为相同。如果一个节点在场景图中,那么它是可见的,它的几何形状,粒子系统等也是可见的。因此,如果声音附加到一个节点,它应该立即开始播放,如果该节点是可见的(如果它被隐藏则停止) )。
音频源仅代表实际的音频数据。将其视为纹理:它被加载一次,并且可以被许多3d节点上的许多材料引用。 音频播放器实例化音频源,以便您可以同时在多个节点上播放它,就像您在不同节点上使用相同的材料用于不同的几何形状一样。
希望这有助于并对设计选择提供一些看法,
S上。
答案 1 :(得分:4)
用于播放单个声音为/如果被事件和/或输入击中或以其他方式发起......
有一个特殊的"动作":SCNAction.playAudioSource
class func playAudioSource(_ source: SCNAudioSource,
waitForCompletion wait: Bool) -> SCNAction
然后,要播放声音,请在节点上运行:
myNode.runAction(myActionName)