/// <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(); } }
/// <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(); } }
/// <summary> /// Set the cutscene into an active state. /// </summary> public void EnterPreviewMode() { if (state == TimeLineState.Inactive) { initialize(); bake(); SetRunningTime(RunningTime); state = TimeLineState.Paused; } }
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(); } } }
/// <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); }
/// <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); } }
/// <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()); } }
/// <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(); } }
/// <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; } }
/// <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()); } }
/// <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()); } } }
/// <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"; }
// Start is called before the first frame update void Start() { state = TimeLineState.Paused; }
/// <summary> /// 运行 /// </summary> public void Play() { State = TimeLineState.Playing; }