Unity按钮切换音乐异常:点击仅播放首曲,求解决方案
问题分析
你的代码存在两个核心问题:
- 每次点击按钮都会启动新的
PlayClips协程,而协程内的for循环始终从i=0开始,导致每次点击都重新播放第一首歌。 - 协程的自动播放逻辑不符合需求——你需要的是点击触发切换,而非让协程自动按顺序播放所有歌曲;同时原代码里的循环重置逻辑(
i == clips.Length)永远不会触发,因为for循环条件是i < clips.Length。
解决方案
我们不需要用协程来自动播放序列,而是维护一个当前歌曲索引,每次点击按钮时直接切换到下一首,停止当前播放并启动新的歌曲。这样既满足“随时点击切换”的需求,也不会造成卡顿。
修改后的完整代码:
using UnityEngine; public class Snow_Mountain : MonoBehaviour { public AudioClip[] clips; public AudioSource source; // 当前播放的歌曲索引,初始为-1表示还未播放过 private int currentSongIndex = -1; public void CallMethod() { // 切换到下一首,取模实现循环 currentSongIndex = (currentSongIndex + 1) % clips.Length; // 先停止当前播放的音频(如果有的话) if (source.isPlaying) { source.Stop(); } // 赋值新的音频片段并播放 source.clip = clips[currentSongIndex]; source.Play(); Debug.Log($"当前播放第{currentSongIndex + 1}首歌"); } }
代码说明
currentSongIndex:记录当前播放的歌曲索引,初始设为-1,首次点击时会变成0(对应第一首歌)。- 点击按钮时,通过
(currentSongIndex + 1) % clips.Length实现循环切换——播放完第4首后,下一次点击会回到第1首。 - 每次切换前先停止当前音频,避免两首歌重叠播放,然后赋值新的音频片段并启动播放。
- 去掉了不必要的协程和复杂循环,逻辑更简洁,也不会出现卡顿问题。
内容的提问来源于stack exchange,提问作者Z.Mizzi
相关产品推荐
相关产品推荐

