如何在Sequencer播放完成后调用close()方法(不使用延时)
如何在Unity Sequencer播放完毕后关闭并确保声音播放完成再调用close()?
首先,针对Sequencer本身播放完成后关闭的需求,我们可以利用Unity的PlayableDirector组件的完成回调事件来实现,完全不需要用延时,这是最可靠的方式:
- 先获取到你的
PlayableDirector组件实例(可以通过代码查找或者Inspector面板直接引用) - 给它添加
completed事件的监听,在回调方法里执行后续的关闭逻辑:
using UnityEngine; using UnityEngine.Playables; public class SequencerHandler : MonoBehaviour { public PlayableDirector sequencerDirector; void Start() { // 启动Sequencer前先注册完成回调 sequencerDirector.completed += OnSequencerCompleted; sequencerDirector.Play(); } private void OnSequencerCompleted(PlayableDirector director) { // 移除回调避免重复触发 director.completed -= OnSequencerCompleted; // 检查声音是否还在播放,确认完成后再关闭 CheckAudioCompletionThenClose(); } private void CheckAudioCompletionThenClose() { // 遍历Sequencer的所有轨道,找到播放声音的轨道 foreach (var track in sequencerDirector.playableAsset.outputs) { if (track.sourceObject is AudioClipPlayableAsset audioAsset) { // 获取对应的AudioSource(替换成你实际的获取方式,比如场景中直接引用) AudioSource audioSource = GetComponent<AudioSource>(); if (audioSource != null) { // 监听AudioSource的播放完成事件 audioSource.RegisterCallback(AudioSourcePlaybackCompleted, OnAudioFinished); return; } } } // 如果没有需要等待的声音,直接执行关闭 CloseSequencer(); } private void OnAudioFinished(AudioSource source) { source.UnregisterCallback(AudioSourcePlaybackCompleted, OnAudioFinished); CloseSequencer(); } private void CloseSequencer() { // 这里写入你的关闭逻辑,比如禁用组件、销毁对象等 Debug.Log("Sequencer播放完成且声音已结束,执行关闭操作"); // 示例:gameObject.SetActive(false); } }
关键细节说明:
- 监听PlayableDirector的completed事件:这是确保Sequencer本身播放完成的核心,它会在整个序列的所有轨道执行完毕时触发,比任何延时都精准可靠。
- 处理声音播放完成:如果声音是Sequencer轨道的一部分,需要找到对应的
AudioSource并监听它的AudioSourcePlaybackCompleted回调(Unity 2020及以上版本支持)。这种方式完全不需要依赖延时,能准确捕捉声音结束的时机。 - 避免重复监听:记得在回调触发后移除事件监听,防止内存泄漏或者重复执行逻辑。
如果你的声音是通过独立的AudioSource(而非Sequencer轨道)播放的,可以用这种“双等待”的方式,确保Sequencer和声音都完成后再关闭:
private void Start() { sequencerDirector.completed += OnSequencerCompleted; AudioSource audioSource = GetComponent<AudioSource>(); audioSource.RegisterCallback(AudioSourcePlaybackCompleted, OnAudioFinished); sequencerDirector.Play(); audioSource.Play(); } private bool isSequencerDone = false; private bool isAudioDone = false; private void OnSequencerCompleted(PlayableDirector director) { isSequencerDone = true; TryClose(); } private void OnAudioFinished(AudioSource source) { isAudioDone = true; TryClose(); } private void TryClose() { if (isSequencerDone && isAudioDone) { CloseSequencer(); } }
这种方式可以灵活同时等待两个条件满足,再执行关闭操作。
内容的提问来源于stack exchange,提问作者Rajesh Pandey
相关产品推荐
相关产品推荐

