问题 调节SKAction的音量playSoundFileNamed:


有没有办法调节通过SKAction播放的声音音量 playSoundFileNamed:waitForCompletion:

我想在我的游戏中实现一个简单的音乐和声音效果滑块。我可以通过AVAudioPlayer轻松控制背景音乐,但所有音效都通过SKAction播放。


10456
2017-12-04 09:14


起源

您也可以在SKScene中使用AVAudioPlayer - AndyOS
我知道,但使用SKAction对我来说更方便。由于在通过SKAction序列实现的角色动画期间播放的大部分声音。我知道我可以使用runBlock动作并以任何我想要的方式实现播放声音,但我不想诉诸于此,如果我有办法在这里播放它:) - Dobroćudni Tapir


答案:


遗憾的是,您无法使用SKAction修改音量,因此您也必须使用AVAudioPlayer作为效果。 您可以实现一个自定义的playSoundFileNamed:waitForCompletion:volume:正如您所想的那样使用runBlock,因此您的代码将与使用playSoundFileNamed:waitForCompletion:相差无几。


4
2017-12-04 11:01





这是我如何处理这个问题的代码

NSError *error;
NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"pew-pew-lei" withExtension:@"caf"];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
[player setVolume:masterVolume];
[player prepareToPlay];

SKAction*   playAction = [SKAction runBlock:^{
    [player play];
}];
SKAction *waitAction = [SKAction waitForDuration:player.duration+1];
SKAction *sequence = [SKAction sequence:@[playAction, waitAction]];

[self runAction:sequence];

masterVolume变量只是一些预设变量,用户可以从0.0-1.0更改

waitAction确保播放器在播放整个声音之前不会被删除

希望这可以帮助!


10
2018-05-25 23:08



此代码有效但最后一行应为:[self runAction:sequence]; (而不是[self runAction:groupActions];)而你需要#import <AVFoundation / AVFoundation.h> - user955853
感谢您的修复,编辑了上面的代码! - Chris Brasino
这有效!试图从我的DAW导出声音效果,由于某种原因无法降低音量!奇怪的。这让我可以使用我想要的声音效果,并且我能够降低代码中的音量。 - Paul


迅速:

以来 iOS 9.0 如果您已经运行了音频,则可以将音量更改为运行其他操作的节点(请记住,如果你有一些与之相关的东西,那么这个人就不会工作了 repeatForever):

let changeVolumeAction = SKAction.changeVolume(to: 0.3, duration: 0.3)
node.run(changeVolume)

或者您可以创建一个组并使用正确的音量启动音频:

let effectAudioAction = SKAction.playSoundFileNamed("electricshockLow.mp3", waitForCompletion: false)
let changeVolumeAction = SKAction.changeVolume(to: 0.3, duration: 0.3)
let effectAudioGroup = SKAction.group([effectAudioAction,changeVolumeAction])
node.run(effectAudioGroup)

1
2018-06-15 09:50