chenxin
2020-11-05 d6161eec964b2eeb23bd93c84c29f8ffd3a2d06f
Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using UnityEngine;
using Core.Utilities;
using TowerDefense.UI.HUD;
/**
 * 无尽模式boss技能管理器
@@ -33,10 +34,29 @@
        private List<EndlessBossSkill> waitList;
        /// <summary>
        /// boss技能状态
        /// </summary>
        private EndlessBossSkillState skillState;
        /// <summary>
        /// 是否终止使用技能
        /// </summary>
        /// <value></value>
        private bool isPaused { get; set; }
        /// <summary>
        /// 当前正在处理的技能
        /// </summary>
        private EndlessBossSkill currentSkill;
        /// <summary>
        /// 飘字是否完成
        /// </summary>
        private bool isFloatWordCompleted { get; set; } = true;
        /// <summary>
        /// boss技能动作是否完成
        /// </summary>
        private bool isSkillActionCompleted { get; set; } = true;
        // Start is called before the first frame update
        private void Start()
@@ -49,8 +69,51 @@
        // Update is called once per frame
        private void Update()
        {
            if (isPaused) return;
            if (isPaused || EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
            switch (skillState)
            {
                case EndlessBossSkillState.Init:
                    break;
                case EndlessBossSkillState.Wait:
                    HandleWait(Time.deltaTime);
                    break;
                case EndlessBossSkillState.FloatWord:
                    if (isFloatWordCompleted)
                    {
                        EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessBossSummonEnd, OnEndlessBossActionEnd);
                        EndlessBossCtrl.instance.ChangeState(EndlessBossActionState.Summon);
                        isSkillActionCompleted = false;
                        ChangeState(EndlessBossSkillState.PerformAction);
                    }
                    break;
                case EndlessBossSkillState.PerformAction:
                    if (isSkillActionCompleted)
                        ChangeState(EndlessBossSkillState.ReleaseSkill);
                    break;
                case EndlessBossSkillState.ReleaseSkill:
                    if (currentSkill != null)
                    {
                        RemoveSkill(currentSkill);
                        currentSkill.ReleaseSkill();
                        currentSkill = null;
                    }
                    ChangeState(EndlessBossSkillState.Wait);
                    break;
            }
        }
        /// <summary>
        /// boss技能动作完成
        /// </summary>
        private void OnEndlessBossActionEnd()
        {
            EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSummonEnd, OnEndlessBossActionEnd);
            isSkillActionCompleted = true;
        }
        private void HandleWait(float deltaTime)
        {
            for (int i = 0; i < skillList.Count; ++i)
            {
                skillList[i].Update(Time.deltaTime);
@@ -63,10 +126,27 @@
            {
                if (cdList[i].IsConditionOK)
                {
                    cdList[i].ReleaseSkill();
                    RemoveSkill(cdList[i]);
                    currentSkill = cdList[i];
                    EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitle);
                    isFloatWordCompleted = false;
                    ChangeState(EndlessBossSkillState.FloatWord);
                    break;
                }
            }
        }
        private void OnGlintTitleCompleted()
        {
            EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
            isFloatWordCompleted = true;
        }
        private void ChangeState(EndlessBossSkillState newState)
        {
            if (newState == skillState) return;
            skillState = newState;
        }
        /// <summary>
@@ -90,6 +170,7 @@
            }
            isPaused = false;
            ChangeState(EndlessBossSkillState.Wait);
        }
        /// <summary>
@@ -107,6 +188,8 @@
            cdList.Clear();
            waitList.Clear();
            isPaused = true;
            ChangeState(EndlessBossSkillState.Init);
            ClearEvent();
        }
        /// <summary>
@@ -122,6 +205,20 @@
            cdList.Clear();
            waitList.Clear();
            isPaused = true;
            ChangeState(EndlessBossSkillState.Init);
            ClearEvent();
        }
        private void ClearEvent()
        {
            if (!isFloatWordCompleted)
                EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
            if (!isSkillActionCompleted)
            {
                EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSummonEnd, OnEndlessBossActionEnd);
                EndlessBossCtrl.instance.ChangeState(EndlessBossActionState.Standing);
            }
        }
        /// <summary>
@@ -130,6 +227,7 @@
        public void Restart()
        {
            isPaused = false;
            ChangeState(EndlessBossSkillState.Wait);
        }
        /// <summary>