From 0d6a2e6d4b9de57a13c2bcb32148e1eb97ef1b1f Mon Sep 17 00:00:00 2001 From: wangguan <wangguan@kt007.com> Date: Tue, 15 Dec 2020 16:53:34 +0800 Subject: [PATCH] 玩家通关打点位置修改为结算的时候统计 --- Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs | 348 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 295 insertions(+), 53 deletions(-) diff --git a/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs b/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs index f8f85e9..39b6abd 100644 --- a/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs +++ b/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs @@ -6,11 +6,11 @@ using TowerDefense.Towers.Data; using TowerDefense.Towers.Placement; using UnityEngine; -using UnityEngine.UI; using KTGMGemClient; using System.Collections; using System.Collections.Generic; using TowerDefense.Nodes; +using TowerDefense.UI.HUD; namespace TowerDefense.Level { @@ -22,9 +22,51 @@ public class EndlessLevelManager : Singleton<EndlessLevelManager> { /// <summary> + /// 起始关卡 + /// </summary> + protected int startLevel { get; set; } = 1; + + /// <summary> /// 当前的关卡等级 /// </summary> public int CurrentLevel { get; set; } = 1; + + private float dropRate; + + /// <summary> + /// 当前金币掉率 + /// </summary> + /// <value></value> + public float DropRate + { + get + { + return dropRate; + } + set + { + dropRate = value; + Debug.Log("设置了掉率" + dropRate); + } + } + + private int dropCoin; + + /// <summary> + /// 当前金币 + /// </summary> + /// <value></value> + public int DropCoin + { + get + { + return dropCoin; + } + set + { + dropCoin = value; + } + } protected static readonly int MAX_TOWER = 5; @@ -110,11 +152,6 @@ public event Action LevelCompleted; /// <summary> - /// Fired when all of the home bases are destroyed - /// </summary> - public event Action LevelFailed; - - /// <summary> /// Fired when the level state is changed - first parameter is the old state, second parameter is the new state /// </summary> public event Action<LevelState, LevelState> LevelStateChanged; @@ -141,6 +178,8 @@ /// </summary> public List<Node> StartingNodeList; + public List<Node> EndNodeList; + /// <summary> /// 已经完成的关卡数量 /// </summary> @@ -151,12 +190,67 @@ /// </summary> /// <value></value> public int SelectBuffNeddLevels { get; set; } - // public int SelectBuffNeddLevels { get; set; } = 2; /// <summary> - /// buff是否选择完成 + /// 弹框完成 /// </summary> - private bool isBuffSelectCompleted = true; + private bool isPopDone = true; + + /// <summary> + /// 新手第一关是否完成 + /// </summary> + private bool isFirstLevelCompleted = false; + private bool isSecondLevelCompleted = false; + private bool isThirdLevelCompleted = false; + + private bool isStopSecondWaveCompleted = false; + + /// <summary> + /// 赛道长度 + /// </summary> + private float tunelLength; + + private List<Vector3> homeBasePositionList; + + private ElfUpgrade elfPanelUpgrade; + + /// <summary> + /// 根据赛道id(1~5)获得基地坐标 + /// </summary> + /// <param name="tunelId"></param> + /// <returns></returns> + public Vector3 GetHomeBasePosition(int tunelId) + { + return homeBasePositionList[tunelId - 1]; + } + + /// <summary> + /// 根据赛道id(1~5)和赛道类型获得世界坐标 + /// </summary> + /// <param name="tunelId"></param> + /// <param name="tunelType"></param> + public Vector3 GetTunelWorldPosition(int tunelId, EndlessBossSkillTunelType tunelType) + { + Vector3 startPos = StartingNodeList[tunelId - 1].transform.position; + Vector3 ret = new Vector3(startPos.x, startPos.y, startPos.z); + float add = 0; + + switch (tunelType) + { + case EndlessBossSkillTunelType.Top: + break; + case EndlessBossSkillTunelType.Center: + add = -(tunelLength / 2); + break; + case EndlessBossSkillTunelType.Bottom: + add = -tunelLength; + break; + } + + ret.z += add; + + return ret; + } /// <summary> /// 切换基地 @@ -244,6 +338,7 @@ /// </summary> public virtual void StartLevel() { + EndlessPortData.Init(); ChangeLevelState(LevelState.SpawningEnemies); SelfPlacementArea.startCoinGenMode(); } @@ -275,11 +370,25 @@ // Iterate through home bases and subscribe NumberOfHomeBases = HomeBases.Length; NumberOfHomeBasesLeft = NumberOfHomeBases; + } - for (int i = 0; i < NumberOfHomeBases; i++) + private void Start() + { + EndlessBuffSelect.instance.BuffSelectCompleted += OnBuffSelectCompleted; + EndlessGameUI.instance.GameOverEvent += SafelyCallLevelCompleted; + EventCenter.Ins.Add((int)KTGMGemClient.EventType.ElfUpgradePanelClosed, ElfUpgradePanelClosed); + + homeBasePositionList = new List<Vector3>(); + tunelLength = Mathf.Abs(StartingNodeList[0].transform.position.z - EndNodeList[0].transform.position.z); + + for (int i = 0; i < StartingNodeList.Count; ++i) { - HomeBases[i].homebaseIdx = i % MAX_TOWER; - HomeBases[i].died += OnHomeBaseDestroyed; + Vector3 startPos = StartingNodeList[i].transform.position; + Vector3 pos = new Vector3(); + pos.x = startPos.x; + pos.y = startPos.y; + pos.z = startPos.z - tunelLength; + homeBasePositionList.Add(pos); } } @@ -288,22 +397,44 @@ /// </summary> protected virtual void Update() { + if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return; + if (alwaysGainCurrency || !alwaysGainCurrency && EndlessLeveltate != LevelState.Building && EndlessLeveltate != LevelState.Intro) { CurrencyGainer.Tick(Time.deltaTime); } - if (!isBuffSelectCompleted) + if (!isPopDone) { - isBuffSelectCompleted = true; + isPopDone = true; + if (CurrentLevel > startLevel) + WaveManager.InitPort(CurrentLevel); + EndlessUIStart.instance.Restart(); WaveManager.StartWaves(CurrentLevel); } // 本关卡所有波次全部生成完成 && 敌人全部被清理了,然后就去尝试进入下一关 if (EndlessLeveltate == LevelState.SpawningEnemies && IsAllWaveCompleted && NumberOfEnemies == 0) { - if (!UpdateLevel()) - ChangeLevelState(LevelState.AllEnemiesSpawned); + // 新手的话,第一关完了暂停 + if (!GameConfig.IsNewbie) + { + if (!UpdateLevel()) + ChangeLevelState(LevelState.AllEnemiesSpawned); + } + // else if (!isFirstLevelCompleted) + // { + // isFirstLevelCompleted = true; + // EndlessUIStart.instance.Pause(); + // // 第一关的怪全部被杀光 + // EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillDone); + // } + // else if (!isSecondLevelCompleted) + // { + // Debug.Log("开始第三关???"); + // isSecondLevelCompleted = true; + // //EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateThirdWave); + // } } } @@ -316,12 +447,6 @@ if (WaveManager != null) WaveManager.AllWaveCompleted -= AllWaveCompleted; - - // Iterate through home bases and unsubscribe - for (int i = 0; i < NumberOfHomeBases; i++) - { - HomeBases[i].died -= OnHomeBaseDestroyed; - } } /// <summary> @@ -330,6 +455,36 @@ protected virtual void AllWaveCompleted() { IsAllWaveCompleted = true; + int score = EndlessPortData.GetLevelScore(CurrentLevel); + Debug.Log($"--------------------- 通过第{CurrentLevel}关,+{score}分 ---------------------"); + // 关卡通过,加分 + EndlessScoreManager.instance.AddScore(score); + EndlessBossSkillManager.instance.ClearSkillList(); + EndlessBossCtrl.instance.ChangeState(EndlessBossActionState.Death); + + if (GameConfig.IsNewbie) + { + if (!isFirstLevelCompleted) + { + isFirstLevelCompleted = true; + EndlessUIStart.instance.Pause(); + // 第一关的怪全部被杀光 + EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillDone); + } + else if (!isSecondLevelCompleted) + { + //Debug.Log("开始第三关???"); + isSecondLevelCompleted = true; + EndlessUIStart.instance.Pause(); + EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillSecondDone); + } + else if (isFirstLevelCompleted && isSecondLevelCompleted && !isThirdLevelCompleted) + { + isThirdLevelCompleted = true; + EndlessUIStart.instance.Pause(); + EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillThirdDone); + } + } } /// <summary> @@ -339,9 +494,6 @@ { ++CurrentLevel; IsAllWaveCompleted = false; - - // 进入boss虚弱状态 - Debug.Log("--------------------- 进入boss虚弱状态 ---------------------"); // 所有关卡全部结束 if (CurrentLevel > EndlessPortData.MaxLevel) @@ -353,12 +505,24 @@ } /// <summary> + /// 新手更新关卡 + /// </summary> + public void NewbieUpdateLevel() + { + ++CurrentLevel; + WaveManager.InitPort(CurrentLevel); + IsAllWaveCompleted = false; + EndlessUIStart.instance.Restart(); + WaveManager.StartWaves(CurrentLevel); + } + + /// <summary> /// 延迟进入下一关 /// </summary> /// <returns></returns> private IEnumerator DelayToNextLevel() { - yield return new WaitForSeconds(5f); + yield return new WaitForSeconds(2f); BeginLevel(); } @@ -367,7 +531,44 @@ /// </summary> private void BeginLevel() { - ShowSelectBuffUI(); + if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return; + + EndlessBossCtrl.instance.ClearBoss(); + + if (CurrentLevel == startLevel) + WaveManager.InitPort(CurrentLevel); + + if (!GameConfig.IsNewbie) + { + // buff池的初始化要从正式关卡算起,不算新手关 + EndlessBuffData.InitEndlessBuffPool(GameConfig.IsNewbieStart ? CurrentLevel - EndlessPortData.NewbieTotalLevel : CurrentLevel); + PopUpPanel(); + EndlessRandomTower.instance.SetCountDown(false); + } + else + { + EndlessUIStart.instance.Restart(); + WaveManager.StartWaves(CurrentLevel); + } + } + + /// <summary> + /// 弹出面板 + /// </summary> + private void PopUpPanel() + { + EndlessUIStart.instance.Pause(); + List<List<EndlessPortConfig>> list = EndlessPortData.GetLevelWaveData(CurrentLevel); + + if (list.Count > 0) + { + int level = list[0][0].Config.evolution_lv; + + if (level > 0) + ShowElfUpgradePanel(level); + else + ShowSelectBuffUI(); + } } /// <summary> @@ -380,29 +581,40 @@ if (list.Count == 0) { - isBuffSelectCompleted = false; + isPopDone = false; return; } - EndlessUIStart.instance.SelectBuffUI.SetActive(true); + EndlessBuffSelect.instance.Refresh(list); + EndlessBuffSelect.instance.ShowBuffUI(); + } - for (int i = 0; i < 3; ++i) - { - GameObject descObj = GameObject.Find($"BuffDesc{i}"); - Text obj = descObj.GetComponent<Text>(); - obj.text = list[i].Config.brief; - } + private void ShowElfUpgradePanel(int level) + { + GameObject elfUpgradeObj = Instantiate(Resources.Load<GameObject>("UI/ElfUpgrade/ElfUpgradePanel"), GameObject.Find("UICamera/BottomCanvas/Panel").transform); + elfPanelUpgrade = elfUpgradeObj.GetComponent<ElfUpgrade>(); + elfPanelUpgrade.SetUpgradeLevel(level); } /// <summary> /// buff选择完成 /// </summary> /// <param name="index"></param> - public void OnBuffSelectCompleted(int index) + private void OnBuffSelectCompleted(int index) { - EndlessUIStart.instance.SelectBuffUI.SetActive(false); - isBuffSelectCompleted = false; + isPopDone = false; EndlessBuffManager.instance.AddBuff(EndlessBuffData.GetBuffByIndex(index)); + EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBuffRefresh); + } + + /// <summary> + /// 关闭了精灵升级界面 + /// </summary> + private void ElfUpgradePanelClosed() + { + isPopDone = false; + EndlessGameUI.instance.UpgradeAllTowerMinLevel(elfPanelUpgrade.GetUpgradeLevel() - 1); + EndlessRandomTower.instance.SetCountDown(true, true); } /// <summary> @@ -430,7 +642,7 @@ ChangeLevelState(LevelState.Win); break; case LevelState.Lose: - SafelyCallLevelFailed(); + SafelyCallLevelCompleted(); break; case LevelState.Win: SafelyCallLevelCompleted(); @@ -453,11 +665,11 @@ homeBaseDestroyed(); } - // If there are no home bases left and the level is not over then set the level to lost - if ((NumberOfHomeBasesLeft < 3) && !isGameOver) - { - ChangeLevelState(LevelState.Lose); - } + // // If there are no home bases left and the level is not over then set the level to lost + // if ((NumberOfHomeBasesLeft < 3) && !isGameOver) + // { + // ChangeLevelState(LevelState.Lose); + // } } /// <summary> @@ -465,6 +677,7 @@ /// </summary> protected virtual void SafelyCallLevelCompleted() { + EndlessDropManager.instance.PickUpAllDrop(); if (LevelCompleted != null) LevelCompleted(); } @@ -485,15 +698,6 @@ } /// <summary> - /// Calls the <see cref="levelFailed"/> event - /// </summary> - protected virtual void SafelyCallLevelFailed() - { - if (LevelFailed != null) - LevelFailed(); - } - - /// <summary> /// 兵线的所有基地都已经被摧毁,停止某一条兵线的出兵 /// </summary> /// <param name="index"></param> @@ -506,5 +710,43 @@ --WaveManager.TotalWaveLines; } } + + /// <summary> + /// 暂停波次,小怪停止移动,塔停止攻击 + /// </summary> + public void PauseWave() + { + EndlessUIStart.instance.Pause(); + AgentInsManager.instance.SetWaveLineCanMove(-1, false, false); + WaveManager.PauseAllWave(); + EndlessGameUI.instance.SetAttackingTowerState(false); + } + + /// <summary> + /// 恢复波次,小怪 + /// </summary> + public void RestartWave() + { + EndlessUIStart.instance.Restart(); + AgentInsManager.instance.SetWaveLineCanMove(-1, true, false); + WaveManager.RestartAllWave(); + EndlessGameUI.instance.SetAttackingTowerState(true); + } + + /// <summary> + /// 停止第二关波次 + /// </summary> + public void StopSecondWave() + { + if (!isStopSecondWaveCompleted) + { + isStopSecondWaveCompleted = true; + PauseWave(); + } + //EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.SkillStep); + EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.DragStep); + } + + } } \ No newline at end of file -- Gitblit v1.9.1