using System.Collections.Generic; using UnityEngine; using Core.Utilities; using TowerDefense.UI.HUD; /** * 无尽模式boss技能管理器 * @Author: chenxin * @Date: 2020-11-02 16:46:12 */ namespace KTGMGemClient { public class EndlessBossSkillManager : Singleton { /// /// boss技能id列表 /// private List skillIdList; /// /// 技能列表,所有的技能 cdList + waitList = skillList /// private List skillList; /// /// 技能cd列表,技能冷却好了就放到这个队列 /// private List cdList; /// /// 正在等待冷却的技能队列 /// private List waitList; /// /// boss技能状态 /// private EndlessBossSkillState skillState; /// /// 是否终止使用技能 /// private bool isPaused { get; set; } /// /// 当前正在处理的技能 /// private EndlessBossSkill currentSkill; /// /// 飘字是否完成 /// private bool isFloatWordCompleted { get; set; } = true; /// /// boss技能动作是否完成 /// private bool isSkillActionCompleted { get; set; } = true; // Start is called before the first frame update private void Start() { skillList = new List(); cdList = new List(); waitList = new List(); } // Update is called once per frame private void Update() { 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); } 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; } } /// /// boss技能动作完成 /// 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) { 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; } } } /// /// 飘字闪烁完成 /// private void OnGlintTitleCompleted() { EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted); isFloatWordCompleted = true; } private void ChangeState(EndlessBossSkillState newState) { if (newState == skillState) return; skillState = newState; } /// /// 更新关卡需要重新初始化boss技能 /// /// public void Init(List idList) { Debug.Log("--------------------- 初始化boss技能列表 ---------------------"); skillIdList = idList; for (int i = 0; i < idList.Count; ++i) { EndlessBossSkill skill = GetSkillInstanceByType(idList[i]); if (skill != null) { skillList.Add(skill); skill.Init(); waitList.Add(skill); } } isPaused = false; ChangeState(EndlessBossSkillState.Wait); } /// /// 关卡结束需要清理一下技能列表 /// public void ClearSkillList() { Debug.Log("--------------------- 关卡结束,清空技能列表 ---------------------"); for (int i = 0; i < skillList.Count; ++i) { skillList[i].Clear(); } skillList.Clear(); cdList.Clear(); waitList.Clear(); isPaused = true; ChangeState(EndlessBossSkillState.Init); ClearEvent(); } /// /// 波次更新时需要重置所有技能 /// public void 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); } } /// /// 重新开始新的一波,重新启动技能 /// public void Restart() { isPaused = false; ChangeState(EndlessBossSkillState.Wait); } /// /// 获取技能实例 /// /// 技能id /// private EndlessBossSkill GetSkillInstanceByType(int skillId) { boss_skill data = EndlessBossSkillData.GetDataById(skillId); if (data == null) { Debug.LogError($"--------------------- skillId: {skillId},没有对应的技能数据 ---------------------"); return null; } switch ((EndlessBossSkillType)data.skill_class) { case EndlessBossSkillType.ShieldWall: return new BossSkillShieldWall(data); case EndlessBossSkillType.BubbleBomb: return new BossSkillBubbleBomb(data); case EndlessBossSkillType.WoodPile: return new BossSkillWoodPile(data); case EndlessBossSkillType.BondageBubble: return new BossSkillBondageBubble(data); } return null; } /// /// 技能cd好了,加到cd列表 /// /// private void AddSkill(EndlessBossSkill skill) { waitList.Remove(skill); cdList.Add(skill); } /// /// 技能进入冷却状态,加到等待列表 /// /// private void RemoveSkill(EndlessBossSkill skill) { cdList.Remove(skill); waitList.Add(skill); } } }