wangguan
2020-12-29 452c75675679c44cc39b04bdb7d330d7c5c14d5c
Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
@@ -1,7 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Core.Utilities;
using TowerDefense.UI.HUD;
/**
 * 无尽模式boss技能管理器
@@ -33,10 +33,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,24 +68,90 @@
        // Update is called once per frame
        private void Update()
        {
            if (isPaused) return;
            if (isPaused || EndlessGameUI.instance.state == EndlessGameUI.State.GameOver || !EndlessUIStart.instance.IsGameRunning) return;
            for (int i = 0; i < skillList.Count; ++i)
            {
                skillList[i].Update(Time.deltaTime);
                if (skillList[i].IsCDCompleted)
                    AddSkill(skillList[i]);
            }
            for (int i = 0; i < waitList.Count; ++i)
            {
                if (waitList[i].IsCDCompleted)
                    AddSkill(waitList[i]);
            }
            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 < cdList.Count; ++i)
            {
                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, (int)cdList[i].SkillType);
                    isFloatWordCompleted = false;
                    ChangeState(EndlessBossSkillState.FloatWord);
                    break;
                }
            }
        }
        /// <summary>
        /// 飘字闪烁完成
        /// </summary>
        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>
@@ -75,7 +160,6 @@
        /// <param name="idList"></param>
        public void Init(List<int> idList)
        {
            Debug.Log("--------------------- 初始化boss技能列表 ---------------------");
            skillIdList = idList;
            for (int i = 0; i < idList.Count; ++i)
@@ -86,10 +170,12 @@
                {
                    skillList.Add(skill);
                    skill.Init();
                    waitList.Add(skill);
                }
            }
            isPaused = false;
            ChangeState(EndlessBossSkillState.Wait);
        }
        /// <summary>
@@ -97,7 +183,6 @@
        /// </summary>
        public void ClearSkillList()
        {
            Debug.Log("--------------------- 关卡结束,清空技能列表 ---------------------");
            for (int i = 0; i < skillList.Count; ++i)
            {
                skillList[i].Clear();
@@ -107,6 +192,8 @@
            cdList.Clear();
            waitList.Clear();
            isPaused = true;
            ChangeState(EndlessBossSkillState.Init);
            ClearEvent();
        }
        /// <summary>
@@ -114,14 +201,32 @@
        /// </summary>
        public void Reset()
        {
            for (int i = 0; i < skillList.Count; ++i)
            {
                skillList[i].Reset();
            }
            if (isPaused) return;
            cdList.Clear();
            waitList.Clear();
            for (int i = 0; i < skillList.Count; ++i)
            {
                skillList[i].Reset();
                waitList.Add(skillList[i]);
            }
            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 +235,7 @@
        public void Restart()
        {
            isPaused = false;
            ChangeState(EndlessBossSkillState.Wait);
        }
        /// <summary>
@@ -155,6 +261,8 @@
                    return new BossSkillBubbleBomb(data);
                case EndlessBossSkillType.WoodPile:
                    return new BossSkillWoodPile(data);
                case EndlessBossSkillType.BondageBubble:
                    return new BossSkillBondageBubble(data);
            }
            return null;