在C#(Visual Studio 2017)平台游戏中如何同时播放两个音频?
解决C#平台游戏中同时播放背景音乐与音效的问题
嘿,我来帮你搞定这个同时播放音频的难题!你之前用MediaPlayer开线程播放背景音乐的方式,可能因为局部变量被垃圾回收或者实例管理的问题,导致无法同时播放多个音频。下面给你一套可行的方案:
一、重构背景音乐播放逻辑(持续循环)
首先,把背景音乐的MediaPlayer实例改成类的成员变量,避免线程结束后被GC回收导致音乐中断,同时添加循环播放的逻辑:
// 在你的游戏类中声明成员变量 private System.Windows.Media.MediaPlayer _bgMusicPlayer; private string _audioPath; // 假设这是你的音频文件根路径 // 初始化并启动背景音乐的方法 private void StartBackgroundMusic() { _bgMusicPlayer = new System.Windows.Media.MediaPlayer(); // 用Path.Combine拼接路径更安全,避免斜杠问题 string bgMusicPath = System.IO.Path.Combine(_audioPath, "Foniqz_-_Spectrum_Subdiffusion_Mix_real.wav"); _bgMusicPlayer.Open(new System.Uri(bgMusicPath)); // 订阅MediaEnded事件,实现背景音乐循环播放 _bgMusicPlayer.MediaEnded += (sender, e) => { _bgMusicPlayer.Position = TimeSpan.Zero; _bgMusicPlayer.Play(); }; _bgMusicPlayer.Play(); }
调用这个方法的时候,直接在游戏初始化阶段执行就行,不需要额外开线程——MediaPlayer本身就是异步播放的,不会阻塞游戏主线程。
二、实现金币拾取音效的触发播放
对于金币这种短音效,推荐用System.Media.SoundPlayer,它更轻量,适合频繁触发的场景:
// 同样在类中声明音效播放器成员 private System.Media.SoundPlayer _coinSoundPlayer; // 初始化音效播放器(在游戏启动时执行) private void InitializeAudioAssets() { string coinSoundPath = System.IO.Path.Combine(_audioPath, "你的金币音效文件名.wav"); _coinSoundPlayer = new System.Media.SoundPlayer(coinSoundPath); } // 拾取金币时调用这个方法播放音效 private void PlayCoinCollectedSound() { // Play()方法是异步的,不会卡住游戏逻辑 _coinSoundPlayer.Play(); }
如果你的音效是MP3格式,SoundPlayer不支持的话,也可以用另一个MediaPlayer实例来播放:
private void PlayCoinCollectedSound() { var coinPlayer = new System.Windows.Media.MediaPlayer(); string coinSoundPath = System.IO.Path.Combine(_audioPath, "你的金币音效文件名.mp3"); coinPlayer.Open(new System.Uri(coinSoundPath)); coinPlayer.Play(); // 播放结束后关闭播放器释放资源 coinPlayer.MediaEnded += (sender, e) => { var player = sender as System.Windows.Media.MediaPlayer; player?.Close(); }; }
三、关键注意事项
- 避免局部变量被回收:之前的代码里
bg是线程内的局部变量,线程执行完后GC可能会回收它,导致音乐突然停止,所以一定要把长期播放的音频播放器实例设为类成员。 - 路径拼接要规范:用
System.IO.Path.Combine来拼接文件路径,避免因为手动加斜杠导致的路径错误。 - 音频格式兼容性:
SoundPlayer只支持WAV格式,MP3等格式需要用MediaPlayer或者第三方库来处理。
这样修改后,背景音乐就能持续循环播放,同时拾取金币时音效也能正常触发,两者完全不会互相干扰~
内容的提问来源于stack exchange,提问作者Miicat
相关产品推荐
相关产品推荐

