Ejemplo n.º 1
0
        Playable CompileTrackPlayable(PlayableGraph graph, TrackAsset track, GameObject go, IntervalTree <RuntimeElement> tree, AppliedOffsetMode mode)
        {
            var mixer = AnimationMixerPlayable.Create(graph, track.clips.Length);

            for (int i = 0; i < track.clips.Length; i++)
            {
                var c     = track.clips[i];
                var asset = c.asset as PlayableAsset;
                if (asset == null)
                {
                    continue;
                }

                var animationAsset = asset as AnimationPlayableAsset;
                if (animationAsset != null)
                {
                    animationAsset.appliedOffsetMode = mode;
                }

                var source = asset.CreatePlayable(graph, go);
                if (source.IsValid())
                {
                    var clip = new RuntimeClip(c, source, mixer);
                    tree.Add(clip);
                    graph.Connect(source, 0, mixer, i);
                    mixer.SetInputWeight(i, 0.0f);
                }
            }

            return(ApplyTrackOffset(graph, mixer, go, mode));
        }
Ejemplo n.º 2
0
        Playable CreateInfiniteTrackPlayable(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree, AppliedOffsetMode mode)
        {
            if (m_InfiniteClip == null)
            {
                return(Playable.Null);
            }

            var mixer = AnimationMixerPlayable.Create(graph, 1);

            // In infinite mode, we always force the loop mode of the clip off because the clip keys are offset in infinite mode
            //  which causes loop to behave different.
            // The inline curve editor never shows loops in infinite mode.
            var playable = AnimationPlayableAsset.CreatePlayable(graph, m_InfiniteClip, m_InfiniteClipOffsetPosition, m_InfiniteClipOffsetEulerAngles, false, mode, infiniteClipApplyFootIK, AnimationPlayableAsset.LoopMode.Off);

            if (playable.IsValid())
            {
                tree.Add(new InfiniteRuntimeClip(playable));
                graph.Connect(playable, 0, mixer, 0);
                mixer.SetInputWeight(0, 1.0f);
            }

            if (!AnimatesRootTransform())
            {
                return(mixer);
            }

            var rootTrack = isSubTrack ? (AnimationTrack)parent : this;

            return(rootTrack.ApplyTrackOffset(graph, mixer, go, mode));
        }
Ejemplo n.º 3
0
        internal virtual Playable OnCreateClipPlayableGraph(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree)
        {
            if (tree == null)
            {
                throw new ArgumentException("IntervalTree argument cannot be null", "tree");
            }

            if (go == null)
            {
                throw new ArgumentException("GameObject argument cannot be null", "go");
            }

            var blend = CreateTrackMixer(graph, go, clips.Length);

            for (var c = 0; c < clips.Length; c++)
            {
                var source = CreatePlayable(graph, go, clips[c]);
                if (source.IsValid())
                {
                    source.SetDuration(clips[c].duration);
                    var clip = new RuntimeClip(clips[c], source, blend);
                    tree.Add(clip);
                    graph.Connect(source, 0, blend, c);
                    blend.SetInputWeight(c, 0.0f);
                }
            }

            return(blend);
        }
Ejemplo n.º 4
0
        internal virtual Playable OnCreatePlayableGraph(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree)
        {
            if (tree == null)
            {
                throw new ArgumentException("IntervalTree argument cannot be null", "tree");
            }
            if (go == null)
            {
                throw new ArgumentException("GameObject argument cannot be null", "go");
            }
            Playable playable = this.CreateTrackMixer(graph, go, this.clips.Length);

            for (int i = 0; i < this.clips.Length; i++)
            {
                Playable playable2 = this.CreatePlayable(graph, go, this.clips[i]);
                if (playable2.IsValid <Playable>())
                {
                    playable2.SetDuration(this.clips[i].duration);
                    RuntimeClip item = new RuntimeClip(this.clips[i], playable2, playable);
                    tree.Add(item);
                    graph.Connect <Playable, Playable>(playable2, 0, playable, i);
                    playable.SetInputWeight(i, 0f);
                }
            }
            return(playable);
        }
Ejemplo n.º 5
0
        internal override Playable OnCreatePlayableGraph(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree)
        {
            AudioMixerPlayable audioMixerPlayable = AudioMixerPlayable.Create(graph, base.clips.Length, false);

            for (int i = 0; i < base.clips.Length; i++)
            {
                TimelineClip  timelineClip  = base.clips[i];
                PlayableAsset playableAsset = timelineClip.asset as PlayableAsset;
                if (!(playableAsset == null))
                {
                    float num = 0.1f;
                    AudioPlayableAsset audioPlayableAsset = timelineClip.asset as AudioPlayableAsset;
                    if (audioPlayableAsset != null)
                    {
                        num = audioPlayableAsset.bufferingTime;
                    }
                    Playable playable = playableAsset.CreatePlayable(graph, go);
                    if (playable.IsValid <Playable>())
                    {
                        tree.Add(new ScheduleRuntimeClip(timelineClip, playable, audioMixerPlayable, (double)num, 0.1));
                        graph.Connect <Playable, AudioMixerPlayable>(playable, 0, audioMixerPlayable, i);
                        playable.SetSpeed(timelineClip.timeScale);
                        playable.SetDuration(timelineClip.extrapolatedDuration);
                        audioMixerPlayable.SetInputWeight(playable, 1f);
                    }
                }
            }
            return(audioMixerPlayable);
        }
Ejemplo n.º 6
0
        internal Playable CompileTrackPlayable(PlayableGraph graph, TrackAsset track, GameObject go, IntervalTree <RuntimeElement> tree)
        {
            AnimationMixerPlayable animationMixerPlayable = AnimationMixerPlayable.Create(graph, track.clips.Length, false);

            for (int i = 0; i < track.clips.Length; i++)
            {
                TimelineClip  timelineClip  = track.clips[i];
                PlayableAsset playableAsset = timelineClip.asset as PlayableAsset;
                if (!(playableAsset == null))
                {
                    if (timelineClip.recordable)
                    {
                        AnimationPlayableAsset animationPlayableAsset = playableAsset as AnimationPlayableAsset;
                        if (animationPlayableAsset != null)
                        {
                            animationPlayableAsset.removeStartOffset = !timelineClip.recordable;
                        }
                    }
                    Playable playable = playableAsset.CreatePlayable(graph, go);
                    if (playable.IsValid <Playable>())
                    {
                        RuntimeClip item = new RuntimeClip(timelineClip, playable, animationMixerPlayable);
                        tree.Add(item);
                        graph.Connect <Playable, AnimationMixerPlayable>(playable, 0, animationMixerPlayable, i);
                        animationMixerPlayable.SetInputWeight(i, 0f);
                    }
                }
            }
            return(this.ApplyTrackOffset(graph, animationMixerPlayable));
        }
Ejemplo n.º 7
0
        internal override Playable CompileClips(PlayableGraph graph, GameObject go, IList <TimelineClip> timelineClips, IntervalTree <RuntimeElement> tree)
        {
            var clipBlender = AudioMixerPlayable.Create(graph, timelineClips.Count);

#if UNITY_EDITOR
            clipBlender.GetHandle().SetScriptInstance(m_TrackProperties.Clone());
            m_LiveMixerPlayable = clipBlender;
#else
            if (hasCurves)
            {
                clipBlender.GetHandle().SetScriptInstance(m_TrackProperties.Clone());
            }
#endif

            for (int i = 0; i < timelineClips.Count; i++)
            {
                var c     = timelineClips[i];
                var asset = c.asset as PlayableAsset;
                if (asset == null)
                {
                    continue;
                }

                var buffer     = 0.1f;
                var audioAsset = c.asset as AudioPlayableAsset;
                if (audioAsset != null)
                {
                    buffer = audioAsset.bufferingTime;
                }

                var source = asset.CreatePlayable(graph, go);
                if (!source.IsValid())
                {
                    continue;
                }

                if (source.IsPlayableOfType <AudioClipPlayable>())
                {
                    // Enforce initial values on all clips
                    var audioClipPlayable   = (AudioClipPlayable)source;
                    var audioClipProperties = audioClipPlayable.GetHandle().GetObject <AudioClipProperties>();

                    audioClipPlayable.SetVolume(Mathf.Clamp01(m_TrackProperties.volume * audioClipProperties.volume));
                    audioClipPlayable.SetStereoPan(Mathf.Clamp(m_TrackProperties.stereoPan, -1.0f, 1.0f));
                    audioClipPlayable.SetSpatialBlend(Mathf.Clamp01(m_TrackProperties.spatialBlend));
                }

                tree.Add(new ScheduleRuntimeClip(c, source, clipBlender, buffer));
                graph.Connect(source, 0, clipBlender, i);
                source.SetSpeed(c.timeScale);
                source.SetDuration(c.extrapolatedDuration);
                clipBlender.SetInputWeight(source, 1.0f);
            }

            ConfigureTrackAnimation(tree, go, clipBlender);

            return(clipBlender);
        }
Ejemplo n.º 8
0
        internal void ConfigureTrackAnimation(IntervalTree<RuntimeElement> tree, GameObject go, Playable blend)
        {
            if (!hasCurves)
                return;

            blend.SetAnimatedProperties(m_Curves);
            tree.Add(new InfiniteRuntimeClip(blend));

            if (OnTrackAnimationPlayableCreate != null)
                OnTrackAnimationPlayableCreate.Invoke(this, go, blend);
        }
Ejemplo n.º 9
0
 internal virtual Playable CompileClips(PlayableGraph graph, GameObject go, IList<TimelineClip> timelineClips, IntervalTree<RuntimeElement> tree)
 {
     var blend = CreateTrackMixer(graph, go, timelineClips.Count);
     for (var c = 0; c < timelineClips.Count; c++)
     {
         var source = CreatePlayable(graph, go, timelineClips[c]);
         if (source.IsValid())
         {
             source.SetDuration(timelineClips[c].duration);
             var clip = new RuntimeClip(timelineClips[c], source, blend);
             tree.Add(clip);
             graph.Connect(source, 0, blend, c);
             blend.SetInputWeight(c, 0.0f);
         }
     }
     ConfigureTrackAnimation(tree, go, blend);
     return blend;
 }
        Playable CreateInfiniteTrackPlayable(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree, AppliedOffsetMode mode)
        {
            if (m_InfiniteClip == null)
            {
                return(Playable.Null);
            }

            var mixer    = AnimationMixerPlayable.Create(graph, 1);
            var playable = AnimationPlayableAsset.CreatePlayable(graph, m_InfiniteClip, m_InfiniteClipOffsetPosition, m_InfiniteClipOffsetEulerAngles, false, mode, infiniteClipApplyFootIK);

            if (playable.IsValid())
            {
                tree.Add(new InfiniteRuntimeClip(playable));
                graph.Connect(playable, 0, mixer, 0);
                mixer.SetInputWeight(0, 1.0f);
            }

            return(ApplyTrackOffset(graph, mixer, go, mode));
        }
Ejemplo n.º 11
0
        private Playable CreateInfiniteTrackPlayable(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree)
        {
            Playable result;

            if (base.animClip == null)
            {
                result = Playable.Null;
            }
            else
            {
                if (this.m_FakeAnimClip == null || this.m_AnimationPlayableAsset == null)
                {
                    this.m_AnimationPlayableAsset = ScriptableObject.CreateInstance <AnimationPlayableAsset>();
                    this.m_FakeAnimClip           = new TimelineClip(null)
                    {
                        asset                 = this.m_AnimationPlayableAsset,
                        displayName           = "Animation Clip",
                        timeScale             = 1.0,
                        start                 = 0.0,
                        postExtrapolationMode = TimelineClip.ClipExtrapolation.Hold,
                        preExtrapolationMode  = TimelineClip.ClipExtrapolation.Hold
                    };
                    this.m_FakeAnimClip.SetPostExtrapolationTime(TimelineClip.kMaxTimeValue);
                }
                this.m_AnimationPlayableAsset.clip              = base.animClip;
                this.m_AnimationPlayableAsset.position          = this.m_OpenClipOffsetPosition;
                this.m_AnimationPlayableAsset.rotation          = this.m_OpenClipOffsetRotation;
                this.m_AnimationPlayableAsset.removeStartOffset = false;
                this.m_FakeAnimClip.start = 0.0;
                this.m_FakeAnimClip.SetPreExtrapolationTime(0.0);
                this.m_FakeAnimClip.duration = (double)base.animClip.length;
                AnimationMixerPlayable animationMixerPlayable = AnimationMixerPlayable.Create(graph, 1, false);
                Playable playable = this.m_AnimationPlayableAsset.CreatePlayable(graph, go);
                if (playable.IsValid <Playable>())
                {
                    tree.Add(new RuntimeClip(this.m_FakeAnimClip, playable, animationMixerPlayable));
                    graph.Connect <Playable, AnimationMixerPlayable>(playable, 0, animationMixerPlayable, 0);
                    animationMixerPlayable.SetInputWeight(0, 1f);
                }
                result = this.ApplyTrackOffset(graph, animationMixerPlayable);
            }
            return(result);
        }
Ejemplo n.º 12
0
        void InitializeClips(PlayableGraph graph, GameObject go, IntervalTree <RuntimeElement> tree, AudioMixerPlayable clipBlender)
        {
            for (int i = 0; i < clips.Length; i++)
            {
                var c     = clips[i];
                var asset = c.asset as PlayableAsset;
                if (asset == null)
                {
                    continue;
                }

                var buffer     = 0.1f;
                var audioAsset = c.asset as AudioPlayableAsset;
                if (audioAsset != null)
                {
                    buffer = audioAsset.bufferingTime;
                }

                var source = asset.CreatePlayable(graph, go);
                if (!source.IsValid())
                {
                    continue;
                }

                if (source.IsPlayableOfType <AudioClipPlayable>())
                {
                    // Enforce initial values on all clips
                    var audioClipPlayable   = (AudioClipPlayable)source;
                    var audioClipProperties = audioClipPlayable.GetHandle().GetObject <AudioClipProperties>();

                    audioClipPlayable.SetVolume(Mathf.Clamp01(m_TrackProperties.volume * audioClipProperties.volume));
                    audioClipPlayable.SetStereoPan(Mathf.Clamp(m_TrackProperties.stereoPan, -1.0f, 1.0f));
                    audioClipPlayable.SetSpatialBlend(Mathf.Clamp01(m_TrackProperties.spatialBlend));
                }

                tree.Add(new ScheduleRuntimeClip(c, source, clipBlender, buffer));
                graph.Connect(source, 0, clipBlender, i);
                source.SetSpeed(c.timeScale);
                source.SetDuration(c.extrapolatedDuration);
                clipBlender.SetInputWeight(source, 1.0f);
            }
        }