You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:59:24