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

Unity按钮切换音乐异常:点击仅播放首曲,求解决方案

问题分析

你的代码存在两个核心问题:

  1. 每次点击按钮都会启动新的PlayClips协程,而协程内的for循环始终从i=0开始,导致每次点击都重新播放第一首歌。
  2. 协程的自动播放逻辑不符合需求——你需要的是点击触发切换,而非让协程自动按顺序播放所有歌曲;同时原代码里的循环重置逻辑(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:10:29