Пример #1
0
 public override void OnDestroy()
 {
     if (!timeline.IsHostTrack(this))
     {
         if (mixPlayable.IsValid())
         {
             mixPlayable.Destroy();
         }
         if (playableOutput.IsOutputValid())
         {
             XTimeline.graph.DestroyOutput(playableOutput);
         }
         mixJob.Dispose();
         SharedPool <XAnimationTrack> .Return(this);
     }
     base.OnDestroy();
 }
    protected override Playable CreatePlayable(PlayableGraph graph, GameObject gameObject, TimelineClip clip)
    {
        PlayableGraph externalGraph = TimelineManager.Instance.GetGraph();

        if (!animOutput.IsOutputValid())
        {
            PlayableDirector playableDirector = graph.GetResolver() as PlayableDirector;
            Animator         bindAnimator     = playableDirector.GetGenericBinding(this) as Animator;
            animOutput = AnimationPlayableOutput.Create(externalGraph, "AnimOutPut", bindAnimator);
            animMixer  = AnimationMixerPlayable.Create(externalGraph);
            animOutput.SetSourcePlayable(animMixer);
        }

        int clipIndex = 0;
        IEnumerable <TimelineClip> clips = GetClips();

        foreach (var animClip in clips)
        {
            if (animClip == clip)
            {
                var asset = clip.asset as AnimationBlendClip;
                asset.SetOutPutPlayable(clipIndex, animMixer);
                break;
            }
            clipIndex++;
        }
        TimelineClip frontClip = null;

        foreach (var animClip in clips)
        {
            if (frontClip != null)
            {
                if (IsCrossed(frontClip, animClip))
                {
                    (frontClip.asset as AnimationBlendClip)?.SetClipEndCrossed(true);
                }
            }
            frontClip = animClip;
        }

        return(base.CreatePlayable(graph, gameObject, clip));
    }