// -- //

        public override void ProcessFrame(Playable playable, FrameData info, object playerData)
        {
            int inputCount = playable.GetInputCount();

            for (int i = 0; i < inputCount; i++)
            {
                float inputWeight = playable.GetInputWeight(i);
                ScriptPlayable <EventTriggerBehaviour> inputPlayable = (ScriptPlayable <EventTriggerBehaviour>)playable.GetInput(i);
                EventTriggerBehaviour input = inputPlayable.GetBehaviour();

                if (!input.Triggered && inputWeight > 0)
                {
                    if (input.onStartPlaying != null)
                    {
                        Trigger(input.onStartPlaying, input.invoker);
                        input.Triggered = true;
                        lastEvent       = input;
                    }
                }
                else if (input.Triggered && inputWeight == 0)
                {
                    if (input.onFinishedPlaying != null)
                    {
                        Trigger(input.onFinishedPlaying, input.invoker);
                    }

                    input.Triggered = false;
                    lastEvent       = null;
                }
            }
        }
        // -- //

        public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
        {
            var playable = ScriptPlayable <EventTriggerBehaviour> .Create(graph, template);

            EventTriggerBehaviour clone = playable.GetBehaviour();

            clone.onStartPlaying    = onStartPlaying;
            clone.onFinishedPlaying = onFinishedPlaying;
            clone.invoker           = invoker.Resolve(graph.GetResolver());

            return(playable);
        }