static ITLTrack GetTrack(ITimelineLiteObject _timelineLiteObject, TLTrackData _trackData)
        {
            Type trackDataType = _trackData.GetType();

            if (trackDataType == typeof(TLGroupTrackData))
            {
                TLGroupTrackData groupTrackData = _trackData as TLGroupTrackData;
                TLGroupTrack     groupTrack     = new TLGroupTrack(_timelineLiteObject, _trackData as TLGroupTrackData);
                foreach (TLTrackData childTrack in groupTrackData.ChildTracks)
                {
                    ITLTrack track = GetTrack(_timelineLiteObject, childTrack);
                    if (track != null)
                    {
                        groupTrack.ChildTracks.Add(track);
                    }
                }

                return(groupTrack);
            }
            else /* if (typeof(TLBasicTrackData).IsAssignableFrom(trackDataType))*/
            {
                TLBasicTrackData basicTrackData = _trackData as TLBasicTrackData;
                TLBasicTrack     basicTrack     = new TLBasicTrack(_timelineLiteObject, basicTrackData);
                foreach (TLActionData actionData in basicTrackData.Clips)
                {
                    Type actionType;
                    if (ActionDataDict.TryGetValue(actionData.GetType(), out actionType))
                    {
                        ITLAction action =
                            Activator.CreateInstance(actionType, basicTrack, actionData) as ITLAction;
                        if (action != null)
                        {
                            basicTrack.Clips.Add(action);
                        }
                    }
                }
                return(basicTrack);
            }
        }
Esempio n. 2
0
        public override void UpdateActions(int _frame, float _time)
        {
            int limit = clips.Count;

            if (limit == 0)
            {
                return;
            }
            int increment = 1;

            if (!Playable.IsPlayingForward)
            {
                limit     = -1;
                increment = -1;
            }

            if (Playable.IsPlayingForward)
            {
                if (_frame < clips[currentClipIndex].Start)
                {
                    for (int i = clips.Count - 1; i >= 0; i--)
                    {
                        if (_frame > clips[i].Start)
                        {
                            currentClipIndex = i;
                        }
                    }
                }
            }
            else
            {
                if (_frame > clips[currentClipIndex].End)
                {
                    for (int i = 0; i < clips.Count; i++)
                    {
                        if (_frame < clips[i].End)
                        {
                            currentClipIndex = i;
                        }
                    }
                }
            }
            for (int i = currentClipIndex; i != limit; i += increment)
            {
                ITLAction clip = clips[i];
                if (_frame < clip.Start)
                {
                    // 正向播放与反向播放的处理
                    if (Playable.IsPlayingForward)
                    {
                        if (clip.HasTriggered)
                        {
                            clip.ActionStop();
                        }
                        break;
                    }
                    else
                    {
                        if (!clip.HasFinished && (clip.HasTriggered || clip.TriggerOnSkip))
                        {
                            clip.UpdateAction(clip.FrameCount, clip.Duration);
                        }

                        currentClipIndex = Mathf.Clamp(i - 1, 0, clips.Count - 1);
                    }
                }
                else if (_frame >= clip.Start && _frame <= clip.End)
                {
                    if (clip.HasFinished && Playable.FrameChanged)
                    {
                        clip.ActionStop();
                    }

                    if (!clip.HasFinished)
                    {
                        int   frameSinceActionStart = _frame - clip.Start;
                        float timeSinceActionStart  = _time - clip.StartTime;

                        clip.UpdateAction(frameSinceActionStart, timeSinceActionStart);
                    }
                }
                else //if(_frame > clip.end) // 如果完成
                {
                    // 正向播放与反向播放的处理
                    if (Playable.IsPlayingForward)
                    {
                        if (!clip.HasFinished && (clip.HasTriggered || clip.TriggerOnSkip))
                        {
                            clip.UpdateAction(clip.FrameCount, clip.Duration);
                        }

                        currentClipIndex = Mathf.Clamp(i + 1, 0, clips.Count - 1);
                    }
                    else
                    {
                        if (clip.HasTriggered)
                        {
                            clip.ActionStop();
                        }
                        break;
                    }
                }
            }
        }