public void SetEndBehaviour(PlaybackEndBehaviour end)
 {
     for (int i = 0; i < recorders.Count; i++)
     {
         recorders[i].endBehaviour = end;
     }
 }
Esempio n. 2
0
        public ReplaySequenceResult UpdatePlayback(out ReplaySnapshot frame, PlaybackEndBehaviour endBehaviour, float deltaTime)
        {
            PlaybackDirection direction = ReplayTime.TimeScaleDirection;

            // Default to idle
            ReplaySequenceResult result = ReplaySequenceResult.SequenceIdle;

            if (last != null)
            {
                if (direction == PlaybackDirection.Forward)
                {
                    // Calculatet the delta time
                    ReplayTime.Delta = MapScale(playbackTime, last.TimeStamp, current.TimeStamp, 0, 1);
                }
                else
                {
                    // Calculate the delta for reverse playback
                    ReplayTime.Delta = -MapScale(playbackTime, current.TimeStamp, last.TimeStamp, 0, 1);
                }
            }
            else
            {
                if (current == null)
                {
                    ReplayTime.Delta = 0;
                }
                else
                {
                    ReplayTime.Delta = MapScale(playbackTime, 0, current.TimeStamp, 0, 1);
                }
            }

            // Clamp delta
            ReplayTime.Delta = Mathf.Clamp01(ReplayTime.Delta);

            float delta = Mathf.Abs(deltaTime * ReplayTime.TimeScale);

            //if (fixedTime == true)
            //{
            //    // Find the fixed time delta
            //    delta = (Time.fixedDeltaTime * ReplayTime.TimeScale);
            //}
            //else
            //{
            //    // Find the time delta
            //    delta = (Time.deltaTime * Mathf.Abs(ReplayTime.TimeScale));
            //}

            // Advance our frame
            switch (direction)
            {
            case PlaybackDirection.Forward:
            {
                playbackTime += delta;
            }
            break;

            case PlaybackDirection.Backward:
            {
                playbackTime -= delta;
            }
            break;
            }

            switch (endBehaviour)
            {
            default:
            case PlaybackEndBehaviour.EndPlayback:
            {
                // Check for end of playback
                if (playbackTime >= target.Duration || playbackTime < 0)
                {
                    frame = null;
                    return(ReplaySequenceResult.SequenceEnd);
                }
                break;
            }

            case PlaybackEndBehaviour.LoopPlayback:
            {
                if (playbackTime >= target.Duration || playbackTime < 0)
                {
                    playbackTime = (direction == PlaybackDirection.Forward) ? 0 : target.Duration;
                }
                break;
            }

            case PlaybackEndBehaviour.StopPlayback:
            {
                if (playbackTime >= target.Duration)
                {
                    playbackTime = target.Duration;
                }
                else if (playbackTime < 0)
                {
                    playbackTime = 0;
                }
                break;
            }
            }


            // Try to get the current frame
            ReplaySnapshot temp = target.RestoreSnapshot(playbackTime);

            // Check for valid frame
            if (temp != null)
            {
                // Check for sequence advancement
                if (current != temp)
                {
                    // Snap to next frame
                    ReplayTime.Delta = 0;

                    // Set the result
                    result = ReplaySequenceResult.SequenceAdvance;

                    // Update last frame
                    last = current;
                }

                // Update the current frame
                current = temp;
            }
            else
            {
                // Do nothing - We may be inbetween replay frames

                // Trigger sequence end
                //frame = null;
                //return ReplaySequenceResult.SequenceEnd;
            }

            // The sequencer only updated its timing values and there was no state change
            frame = current;
            return(result);
        }