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)); }