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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:23:40