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,提问作者Олег Наливайко
相关产品推荐
相关产品推荐

