示例#1
0
        /// <summary>
        /// Play the cutscene from it's given running time to a new time
        /// </summary>
        /// <param name="newTime">The new time to make up for</param>
        public void ScrubToTime(float newTime)
        {
            float deltaTime = Mathf.Clamp(newTime, 0, Duration) - this.RunningTime;

            state = TimeLineState.Scrubbing;
            if (deltaTime != 0)
            {
                if (deltaTime > (1 / 30f))
                {
                    float        prevTime   = RunningTime;
                    List <float> milestones = getMilestones(RunningTime + deltaTime);
                    for (int i = 0; i < milestones.Count; i++)
                    {
                        float delta = milestones[i] - prevTime;
                        UpdateCutscene(delta);
                        prevTime = milestones[i];
                    }
                }
                else
                {
                    UpdateCutscene(deltaTime);
                }
            }
            else
            {
                Pause();
            }
        }
示例#2
0
 /// <summary>
 /// Skip the cutscene to the end and stop it
 /// </summary>
 public void Skip()
 {
     if (isSkippable)
     {
         SetRunningTime(this.Duration);
         state = TimeLineState.Inactive;
         Stop();
     }
 }
        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            if (State == TimeLineState.Playing || State == TimeLineState.Paused)
            {
                State = TimeLineState.Finished;

                DoReset();
            }
        }
示例#4
0
 /// <summary>
 /// Set the cutscene into an active state.
 /// </summary>
 public void EnterPreviewMode()
 {
     if (state == TimeLineState.Inactive)
     {
         initialize();
         bake();
         SetRunningTime(RunningTime);
         state = TimeLineState.Paused;
     }
 }
示例#5
0
        private IEnumerator freshPlay()
        {
            yield return(StartCoroutine(PreparePlay()));

            // Wait one frame.
            yield return(null);

            // Beging playing
            state = TimeLineState.Playing;
            StartCoroutine(updateCoroutine());
        }
 /// <summary>
 /// 暂停
 /// </summary>
 public void Pause()
 {
     if (State == TimeLineState.Playing || State == TimeLineState.None)
     {
         State = TimeLineState.Paused;
         foreach (var track in m_ActionTracks)
         {
             track.DoPause();
         }
     }
 }
 public void DoReset()
 {
     State = TimeLineState.None;
     foreach (var track in m_ActionTracks)
     {
         track.DoDestroy();
     }
     m_ActionTracks.Clear();
     m_Length       = 0.0f;
     FinishCallback = null;
 }
 /// <summary>
 /// 恢复
 /// </summary>
 public void Resume()
 {
     if (State == TimeLineState.Paused)
     {
         State = TimeLineState.Playing;
         foreach (var track in m_ActionTracks)
         {
             track.DoResume();
         }
     }
 }
示例#9
0
    /// <summary>
    /// 强制关闭手表
    /// </summary>
    /// <param name="dealyResetCamera">是否需要延迟关闭相机</param>
    private void ForceCloseWatch(bool dealyResetCamera)
    {
        m_LookAtState     = TimeLineState.NONE;
        m_SelectedIndex   = -1;
        m_WatchKeyHolding = false;

        ListenHotkeys(true, false);

        InputManager.Instance.HudInputMap = HotKeyMapID.None;

        m_WatchPoint = null;

        m_WatchPanel.gameObject.SetActive(false);

        SetCinemachineTrack(m_OpenTimeline, null, null, null);
        SetCinemachineTrack(m_CloseTimeline, null, null, null);

        m_OpenTimeline.gameObject.SetActive(false);
        m_CloseTimeline.gameObject.SetActive(false);

        m_PostEffectScene.gameObject.SetActive(false);
        m_PostEffectUI.gameObject.SetActive(false);

        Canvas.worldCamera.gameObject.SetActive(false);
        Canvas.worldCamera             = CameraManager.GetInstance().GetUICameraComponent().GetCamera();
        Canvas.worldCamera.cullingMask = 1 << LayerMask.NameToLayer(WATCH_2D_LAYER);
        Canvas.worldCamera.gameObject.SetActive(true);

        LayerUtil.SetGameObjectToLayer(Canvas.gameObject, LayerMask.NameToLayer(WATCH_2D_LAYER), true);
        LayerUtil.SetGameObjectToLayer(m_PostEffectScene, m_PostEffectSceneLayer, false);
        LayerUtil.SetGameObjectToLayer(m_PostEffectUI, m_PostEffectUILayer, false);

        UIManager.Instance.ResetPanelFit(this);

        CinemachineVirtualCamera camera1 = GetOrCreateVirtualCamera(VIRTUAL_CAMERA_NAME_1);
        CinemachineVirtualCamera camera2 = GetOrCreateVirtualCamera(VIRTUAL_CAMERA_NAME_2);

        if (dealyResetCamera)
        {
            camera2.Follow  = camera1.Follow;
            camera1.enabled = camera2.enabled = false;

            UIManager.Instance.StartCoroutine(ResetCameraBrainBlend());
        }
        else
        {
            camera2.Follow  = camera1.Follow = null;
            camera1.enabled = camera2.enabled = false;
        }

        PlayHumanAnimator(false);
    }
示例#10
0
 /// <summary>
 /// 打开动画播放完成时
 /// </summary>
 /// <param name="director">对应的PlayableDirector</param>
 private void OnPlayableDirectorStoped(PlayableDirector director)
 {
     if (director == m_OpenTimeline)
     {
         m_WatchMouseAxis = Vector2.zero;
         m_LookAtState    = TimeLineState.OPENED;
         m_SelectedIndex  = -1;
         UpdateCenterInfo();
     }
     else
     {
         ForceCloseWatch(true);
     }
 }
示例#11
0
        /// <summary>
        /// Plays/Resumes the cutscene from inactive/paused states using a Coroutine.
        /// </summary>
        public void Play()
        {
            if (state == TimeLineState.Inactive)
            {
                StartCoroutine(freshPlay());
            }
            else if (state == TimeLineState.Paused)
            {
                state = TimeLineState.Playing;
                StartCoroutine(updateCoroutine());
            }

            if (CutsceneStarted != null)
            {
                CutsceneStarted(this, new CutsceneEventArgs());
            }
        }
示例#12
0
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="deltaTime"></param>
        public override void DoUpdate(float deltaTime)
        {
            if (State != TimeLineState.Playing)
            {
                return;  //暂停更新
            }
            foreach (var track in m_ActionTracks)
            {
                track.DoUpdate(deltaTime);
            }

            m_Length -= deltaTime;
            if (m_Length <= 0)
            {
                State = TimeLineState.Finished;
                FinishCallback.Invoke();
            }
        }
示例#13
0
        /// <summary>
        /// Preview play readies the cutscene to be played in edit mode. Never use for runtime.
        /// This is necessary for playing the cutscene in edit mode.
        /// </summary>
        public void PreviewPlay()
        {
            if (state == TimeLineState.Inactive)
            {
                EnterPreviewMode();
            }
            else if (state == TimeLineState.Paused)
            {
                resume();
            }

            if (Application.isPlaying)
            {
                state = TimeLineState.Playing;
            }
            else
            {
                state = TimeLineState.PreviewPlaying;
            }
        }
示例#14
0
        /// <summary>
        /// Pause the playback of this cutscene.
        /// </summary>
        public void Pause()
        {
            if (state == TimeLineState.Playing)
            {
                StopCoroutine("updateCoroutine");
            }
            if (state == TimeLineState.PreviewPlaying || state == TimeLineState.Playing || state == TimeLineState.Scrubbing)
            {
                TrackGroup[] trackGroups = GetTrackGroups();
                for (int i = 0; i < trackGroups.Length; i++)
                {
                    trackGroups[i].Pause();
                }
            }
            state = TimeLineState.Paused;

            if (CutscenePaused != null)
            {
                CutscenePaused(this, new CutsceneEventArgs());
            }
        }
示例#15
0
        /// <summary>
        /// Stops the cutscene.
        /// </summary>
        public void Stop()
        {
            this.runningTime = 0f;

            TrackGroup[] trackGroups = GetTrackGroups();
            for (int i = 0; i < trackGroups.Length; i++)
            {
                trackGroups[i].Stop();
            }

            if (state != TimeLineState.Inactive)
            {
                revert();
            }

            if (state == TimeLineState.Playing)
            {
                StopCoroutine("updateCoroutine");
                if (state == TimeLineState.Playing && isLooping)
                {
                    state = TimeLineState.Inactive;
                }
                else
                {
                    state = TimeLineState.Inactive;
                }
            }
            else
            {
                state = TimeLineState.Inactive;
            }

            if (state == TimeLineState.Inactive)
            {
                if (TimelineFinished != null)
                {
                    TimelineFinished(this, new CutsceneEventArgs());
                }
            }
        }
示例#16
0
    /// <summary>
    /// 协程
    /// </summary>
    /// <returns>IEnumerator</returns>
    private IEnumerator UpdateWatch()
    {
        while (true)
        {
            BindWatchPointPosition();

            //如果打开动画已经到了最后一帧,手动调用播放结束回调
            if (m_LookAtState == TimeLineState.OPENING && m_OpenTimeline != null && m_OpenTimeline.isActiveAndEnabled && m_OpenTimeline.state == PlayState.Playing && m_OpenTimeline.time >= m_OpenTimeline.duration)
            {
                OnPlayableDirectorStoped(m_OpenTimeline);
            }

            //分状态处理
            if (m_LookAtState == TimeLineState.NONE)
            {
                if (m_WatchKeyHolding)
                {
                    //启动打开动画
                    PlayTimeLine(m_OpenTimeline);
                    m_LookAtState = TimeLineState.OPENING;
                }
            }
            else if (m_LookAtState == TimeLineState.OPENING)
            {
                //取消打开动画
                if (!InputManager.IsWatchInputMode())
                {
                    ForceCloseWatch(false);
                }
            }
            else if (m_LookAtState == TimeLineState.OPENED)
            {
                if (!InputManager.IsWatchInputMode())
                {
                    ForceCloseWatch(false);
                }
                else if (!m_WatchKeyHolding)
                {
                    if (m_SelectedIndex >= 0)
                    {
                        ListenHotkeys(true, false);

                        // 延迟一帧开子面板,避免子面板出错,导致自已也出错。
                        UIManager.Instance.StartCoroutine(OpenPanel(m_SelectedIndex));

                        //等待窗口打开
                        while (InputManager.IsWatchInputMode())
                        {
                            BindWatchPointPosition();
                            yield return(new WaitForEndOfFrame());
                        }

                        m_WatchPanel.gameObject.SetActive(false);

                        //等待窗口关闭
                        while (!InputManager.IsWatchInputMode())
                        {
                            BindWatchPointPosition();
                            yield return(new WaitForEndOfFrame());
                        }

                        m_WatchPanel.gameObject.SetActive(true);
                    }

                    //启动关闭动画
                    PlayTimeLine(m_CloseTimeline);
                    m_LookAtState     = TimeLineState.CLOSEING;
                    m_WatchKeyHolding = false;
                }
            }

            yield return(new WaitForEndOfFrame());
        }
    }
        private TimeLine CreateBaseTimeLine(TimeSpan? dayStart, TimeSpan? dayEnd, TimeLineState suspendState = TimeLineState.Idle)
        {
            TimeLineMinute suspendMinute;
            suspendMinute.State = suspendState;
            suspendMinute.Mandatory = true;
            suspendMinute.Layer = TimeLineLayer.EveningSuspend;

            TimeLineMinute defaultMinute;
            defaultMinute.State = TimeLineState.Running;
            defaultMinute.Mandatory = false;
            defaultMinute.Layer = TimeLineLayer.EveningSuspend;

            TimeLine timeLine;
            timeLine.StartTime = TimeSpan.FromMinutes(0);
            timeLine.EndTime = TimeSpan.FromMinutes(MinutesInDay - 1);
            timeLine.Duration = MinutesInDay;
            timeLine.Minute = new TimeLineMinute[MinutesInDay];
            timeLine.IsDefault = true;

            int pos = 0;
            int endPos;

            if (dayStart != null)
            {
                endPos = (int)dayStart.Value.TotalMinutes;
                timeLine.IsDefault &= !(pos < endPos);
                while (pos < endPos)
                    timeLine.Minute[pos++] = suspendMinute;
            }

            if (dayEnd == null)
                endPos = MinutesInDay;
            else
                endPos = (int)dayEnd.Value.TotalMinutes;

            while (pos < endPos)
                timeLine.Minute[pos++] = defaultMinute;

            timeLine.IsDefault &= !(pos < MinutesInDay);
            while (pos < MinutesInDay)
                timeLine.Minute[pos++] = suspendMinute;

            return timeLine;
        }
 private String TimeLineStateToString(TimeLineState state)
 {
     if (state == TimeLineState.Hibernating)
         return "Hibernating";
     else if (state == TimeLineState.Idle)
         return "Idle";
     else if (state == TimeLineState.Running)
         return "Running";
     else if (state == TimeLineState.Sleeping)
         return "Sleeping";
     else if (state == TimeLineState.Unspecified)
         return "Unspecified";
     return "Unknown";
 }
示例#19
0
 // Start is called before the first frame update
 void Start()
 {
     state = TimeLineState.Paused;
 }
示例#20
0
 /// <summary>
 /// 运行
 /// </summary>
 public void Play()
 {
     State = TimeLineState.Playing;
 }