public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        AudioMixer trackBinding = playerData as AudioMixer;

        if (!trackBinding)
        {
            return;
        }

        int inputCount = playable.GetInputCount();

        if (_snapshots == null || _snapshots.Length != inputCount)
        {
            _weights   = new float[inputCount];
            _snapshots = new AudioMixerSnapshot[inputCount];
        }

        for (int i = 0; i < inputCount; i++)
        {
            _weights[i] = playable.GetInputWeight(i);
            ScriptPlayable <AudioMixerSnapshotBehaviour> inputPlayable = (ScriptPlayable <AudioMixerSnapshotBehaviour>)playable.GetInput(i);
            AudioMixerSnapshotBehaviour input = inputPlayable.GetBehaviour();
            _snapshots[i] = input.Snapshot;
        }

        trackBinding.TransitionToSnapshots(_snapshots, _weights, 0);
    }
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var playable = ScriptPlayable <AudioMixerSnapshotBehaviour> .Create(graph, template);

        AudioMixerSnapshotBehaviour clone = playable.GetBehaviour();

        clone.Snapshot = mixer.Resolve(graph.GetResolver());
        return(playable);
    }