//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, October 23, 2017 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class DungeonGradeWin : Window { [SerializeField] TweenCurve m_PosTweenCurve1; [SerializeField] TweenCurve m_PosTweenCurve2; [SerializeField] TweenCurve m_ScaleTweenCurve1; [SerializeField] TweenCurve m_ScaleTweenCurve2; [SerializeField] float m_Duration1 = 0.5f; [SerializeField] float m_Duration2 = 1.0f; [SerializeField] PositionTween gradePosTween; [SerializeField] ScaleTween gradeScaleTween; [SerializeField] Image grade; [SerializeField] Text surplusTime; [SerializeField] PositionTween expPosTween; [SerializeField] ScaleTween expScaleTween; [SerializeField] Image expGrade; [SerializeField] Text expText; [SerializeField] GameObject gradeContainer; [SerializeField] GameObject expContainer; DateTime endTime; DateTime dungeonEndTime; [SerializeField] RectTransform[] moveRects; private bool isCanContinue = true; private DungeonModel model { get { return ModelCenter.Instance.GetModel(); } } private int lastStar = 0; private bool timeZeroShow = false; #region Built-in protected override void BindController() { } protected override void AddListeners() { } protected override void OnPreOpen() { model.dungeonCoolDownEvent += DungeonCoolDownEvent; SetTween(gradePosTween, gradeScaleTween, 0); SetTween(expPosTween, expScaleTween, 0); dungeonEndTime = model.GetCoolDownEndTime(DungeonCoolDownType.TowerTake); endTime = model.GetCoolDownEndTime(DungeonCoolDownType.FlagTake); expContainer.SetActive(false); isCanContinue = true; } private void OnEnable() { Display(true); } private void UpdateMissionEvent() { if (lastStar == model.mission.grade || !gameObject.activeInHierarchy) { return; } lastStar = model.mission.grade; ///根据具体副本显示具体数据 int _mapid = model.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID); int rate = 0; if (model.GetRewardRateWithGrade(_mapid, model.mission.grade, out rate)) { expGrade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade))); expText.text = Language.Get("DungeonGrade_2", rate); ShowAwardTween(); } else { grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade))); } } private void ShowAwardTween() { SetTween(expPosTween, expScaleTween, 0); expContainer.gameObject.SetActive(true); expPosTween.Play(() => { OnExpTweenCom(0); }); } private void OnExpTweenCom(int index) { if (index == 0) { SetTween(expPosTween, expScaleTween, 1); expPosTween.Play(); expScaleTween.Play(() => { OnExpTweenCom(1); }); } else if (index == 1) { expContainer.SetActive(false); grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade))); } } private void DungeonCoolDownEvent(DungeonCoolDownType type) { switch (type) { case DungeonCoolDownType.TowerTake: dungeonEndTime = model.GetCoolDownEndTime(type); break; case DungeonCoolDownType.FlagTake: endTime = model.GetCoolDownEndTime(type); break; case DungeonCoolDownType.LeaveMap: if (isCanContinue) { surplusTime.text = Language.Get("DungeonGrade_5", GetStar(model.mission.grade)); } isCanContinue = false; break; } } protected override void OnAfterOpen() { Display(false); model.updateMissionEvent += UpdateMissionEvent; } private void Display(bool _enable) { if (!gameObject.activeInHierarchy) { return; } if (model.mission.grade > 0) { lastStar = model.mission.grade; gradeContainer.SetActive(true); if (model.gradeTween && !_enable) { model.cacheGradeMap = PlayerDatas.Instance.baseData.MapID; SetTween(gradePosTween, gradeScaleTween, 0); gradePosTween.Play(OnGradeTweenCom); model.gradeTween = false; } else { SetTween(gradePosTween, gradeScaleTween, 1); gradePosTween.SetEndState(); gradeScaleTween.SetEndState(); } } else { expContainer.SetActive(false); gradeContainer.SetActive(false); } grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade))); } private void OnGradeTweenCom() { SetTween(gradePosTween, gradeScaleTween, 1); gradePosTween.Play(); gradeScaleTween.Play(); } protected override void OnPreClose() { model.dungeonCoolDownEvent -= DungeonCoolDownEvent; model.updateMissionEvent -= UpdateMissionEvent; } protected override void OnAfterClose() { } protected override void LateUpdate() { base.LateUpdate(); if (isCanContinue) { if (model.mission.grade > 1) { var surplus = endTime - DateTime.Now; surplus = surplus < TimeSpan.Zero ? TimeSpan.Zero : surplus; if (surplus.Equals(TimeSpan.Zero)) { if (timeZeroShow) return; timeZeroShow = true; if (model.GetTrialMaps().Contains(PlayerDatas.Instance.baseData.MapID)) { surplusTime.text = Language.Get("DungeonGradeNextStage"); return; } } else timeZeroShow = false; surplusTime.text = Language.Get("DungeonGrade_3", TimeUtility.SecondsToHMSCHSRetain((int)surplus.TotalSeconds, false, false), GetStar(model.mission.grade - 1)); } else { var surplus = dungeonEndTime - DateTime.Now; surplus = surplus < TimeSpan.Zero ? TimeSpan.Zero : surplus; surplusTime.text = Language.Get("DungeonGrade_4", TimeUtility.SecondsToHMSCHSRetain((int)surplus.TotalSeconds, false, false)); if (surplus.Equals(TimeSpan.Zero)) { isCanContinue = false; surplusTime.text = Language.Get("DungeonGrade_1"); } } } } private void OnDisable() { expContainer.gameObject.SetActive(false); SetTween(gradePosTween, gradeScaleTween, 1); gradePosTween.SetEndState(); gradeScaleTween.SetEndState(); SetTween(expPosTween, expScaleTween, 0); expPosTween.SetStartState(); expScaleTween.SetStartState(); } #endregion private string GetStar(int star) { switch (star) { case 5: return "S"; case 4: return "A"; case 3: return "B"; case 2: return "C"; case 1: return "D"; } return string.Empty; } private void SetTween(PositionTween _posTween, ScaleTween _scaleTween, int index) { _posTween.from = moveRects[index].localPosition; _posTween.to = moveRects[index + 1].localPosition; _posTween.curve = index == 0 ? m_PosTweenCurve1 : m_PosTweenCurve2; _scaleTween.curve = index == 0 ? m_ScaleTweenCurve1 : m_ScaleTweenCurve2; _posTween.duration = index == 0 ? m_Duration1 : m_Duration2; _posTween.delay = index == 0 ? 0 : 1.0f; _posTween.SetStartState(); if (index == 0) { _scaleTween.SetStartState(); } else { _scaleTween.delay = 1.0f; } } #if UNITY_EDITOR [ContextMenu("ExpTween")] public void PreviewExpTween() { SetTween(expPosTween, expScaleTween, 0); expPosTween.Play(OnPreviewExpTweenComplete); } [ContextMenu("GradeTween")] public void PreviewGradeTween() { SetTween(gradePosTween, gradeScaleTween, 0); gradePosTween.Play(OnPreviewGradeTweenComplete); } private void OnPreviewGradeTweenComplete() { SetTween(gradePosTween, gradeScaleTween, 1); gradePosTween.Play(); gradeScaleTween.Play(); } private void OnPreviewExpTweenComplete() { SetTween(expPosTween, expScaleTween, 1); expPosTween.Play(); expScaleTween.Play(); } #endif } }