| | |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using Core.Utilities; |
| | | using TowerDefense.UI.HUD; |
| | | |
| | | /** |
| | | * 无尽模式boss技能管理器 |
| | |
| | | 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() |
| | |
| | | // 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); |
| | |
| | | { |
| | | 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> |
| | |
| | | } |
| | | |
| | | isPaused = false; |
| | | ChangeState(EndlessBossSkillState.Wait); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | cdList.Clear(); |
| | | waitList.Clear(); |
| | | isPaused = true; |
| | | ChangeState(EndlessBossSkillState.Init); |
| | | ClearEvent(); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | 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> |
| | |
| | | public void Restart() |
| | | { |
| | | isPaused = false; |
| | | ChangeState(EndlessBossSkillState.Wait); |
| | | } |
| | | |
| | | /// <summary> |