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

Unity中如何依次播放音频数组?场景切换时实现续播

问题解决:AudioClip数组依次播放&场景切换续播

核心需求梳理

  • 60个音轨的AudioClip数组,按顺序依次播放
  • 场景切换时当前音轨中断,切换后从下一个音轨继续播放(比如场景1播0、1、2,场景2播3,以此类推)
  • 已找到PlayRoundRobin函数,但不清楚正确调用方式

函数调用与优化方案

1. 基础调用方式

你找到的PlayRoundRobin函数逻辑没问题,但要实现需求得注意两点:索引持久化和触发时机。

首先,把这个脚本挂载到一个跨场景不销毁的GameObject上(比如专门的音频管理对象),不然场景切换时脚本会被销毁,索引clipIndex会重置。添加以下代码让对象跨场景存活:

void Awake()
{
    DontDestroyOnLoad(gameObject);
}

然后,调用PlayRoundRobin的时机分两种情况:

  • 自动连续播放:当当前音频播放完毕时自动调用下一个。用协程等待音频播放完成是更稳妥的方式:
IEnumerator PlaySequentially()
{
    while (true)
    {
        PlayRoundRobin();
        // 等待当前播放的音频结束(PlayOneShot的时长等于对应clip的长度)
        yield return new WaitForSeconds(clipArray[clipIndex - 1].length);
    }
}

// 在Start方法里启动协程
void Start()
{
    StartCoroutine(PlaySequentially());
}
  • 手动触发播放:比如场景加载完成后播放下一个,就在每个场景的初始化脚本里找到音频管理对象,调用PlayRoundRobin:
// 场景初始化脚本中的代码
void Start()
{
    AudioManager audioManager = FindObjectOfType<AudioManager>(); // 假设你的音频管理脚本名为AudioManager
    audioManager.PlayRoundRobin();
}

2. 函数逻辑优化

原函数可以简化,用取模运算替代if-else,实现更简洁的循环逻辑:

public AudioClip[] clipArray;
public AudioSource effectSource;
private int clipIndex;

void Awake()
{
    DontDestroyOnLoad(gameObject);
}

void PlayRoundRobin()
{
    effectSource.PlayOneShot(clipArray[clipIndex]);
    clipIndex = (clipIndex + 1) % clipArray.Length;
}

当clipIndex走到数组末尾时,会自动重置为0,实现循环播放。

关键注意事项

  • 确保effectSource已在Inspector面板中赋值,且AudioSource的Play On Awake选项要取消勾选,避免自动播放干扰流程。
  • 如果场景切换时需要立即中断当前音频,可以在场景加载前调用effectSource.Stop();,比如在场景切换回调中:
void OnLevelWasLoaded(int level)
{
    effectSource.Stop();
    PlayRoundRobin(); // 场景加载完成后直接播放下一个音轨
}

内容的提问来源于stack exchange,提问作者Олег Наливайко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:20:29