using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.Playables;

/// <summary>
/// Playable graph for audio crossfading.
/// </summary>
public class AudioCrossfadeGraph
{
    PlayableGraph m_graph;
    AudioClipPlayable[] m_clipPlayables;
    AudioMixerPlayable m_mixerPlayable;
    AudioPlayableOutput m_output;
    AudioCrossfadePlayable m_crossfadeBehaviour;
    ScriptPlayable<AudioCrossfadePlayable> m_crossfadePlayable;

    public bool IsPlaying
    {
        get { return m_graph.IsValid() && m_graph.IsPlaying(); }
    }

    public double Time
    {
        get { return m_crossfadePlayable.GetTime(); }
    }

    public PlayableGraph Graph
    {
        get { return m_graph; }
    }

    public AudioMixerPlayable Mixer
    {
        get { return m_mixerPlayable; }
    }

    public ArrayReader<AudioClipPlayable> ClipPlayables
    {
        get { return m_clipPlayables; }
    }

    public ScriptPlayable<AudioCrossfadePlayable> CallbackPlayable
    {
        get { return m_crossfadePlayable; }
    }

    public int CurrentClipIndex
    {
        get { return m_crossfadeBehaviour.CurrentIndex; }
    }

    public PlayableOutput Output
    {
        get { return m_output; }
    }

    public void Create(AudioSource audioSource, AudioClip[] clips)
    {
        Destroy();

        m_graph = PlayableGraph.Create("AudioCrossfadeGraph");
        m_graph.SetTimeUpdateMode(DirectorUpdateMode.DSPClock);
        m_graph.Stop();

        m_mixerPlayable = AudioMixerPlayable.Create(m_graph, clips.Length);

        m_clipPlayables = new AudioClipPlayable[clips.Length];
        for (int i = 0; i < clips.Length; i++)
        {
            m_clipPlayables[i] = AudioClipPlayable.Create(m_graph, clips[i], true);
            m_mixerPlayable.ConnectInput(i, m_clipPlayables[i], 0, i == 0 ? 1 : 0);
        }

        m_crossfadePlayable = AudioCrossfadePlayable.Create(m_graph, m_mixerPlayable);
        m_crossfadeBehaviour = m_crossfadePlayable.GetBehaviour();

        m_output = AudioPlayableOutput.Create(m_graph, "AudioCrossfade", audioSource);
        m_output.SetSourcePlayable(m_crossfadePlayable);
    }

    public void Destroy()
    {
        if (m_graph.IsValid())
        {
            m_graph.Destroy();
        }
    }

    public void Crossfade(int clipIndex, float fadeDuration)
    {
        if (clipIndex >= 0 && !m_graph.IsPlaying())
        {
            m_graph.Play();
        }
        m_crossfadeBehaviour.Crossfade(clipIndex, fadeDuration);
    }

    public void Switch(int clipIndex)
    {
        if (clipIndex >= 0 && !m_graph.IsPlaying())
        {
            m_graph.Play();
        }
        m_crossfadeBehaviour.Switch(clipIndex);
    }

    /// <summary>
    /// Plays or continues playing the audio.
    /// </summary>
    public void Play()
    {
        if (!m_graph.IsPlaying())
        {
            m_graph.Play();
        }
    }

    /// <summary>
    /// Pauses the audio.
    /// </summary>
    public void Pause()
    {
        if (m_graph.IsPlaying())
        {
            m_graph.Stop();
        }
    }
}

Add a code snippet to your website: www.paste.org