using System.Collections; using System.Collections.Generic; using UnityEngine; namespace WildAttack { /// /// 关卡管理类 /// public class ProcessManager : Singleton { #region Members // 当前关卡 private int currLevel; public int CurrLevel { get { return currLevel; } } // 关卡开始后时间 private float currLevelTime; //private int nextMonsterId; private ProcessData configData; // 怪物索引 private int currMonsterIndex; // 当前关卡死亡数量 private int enemyDeadNum = 0; public int EnemyDeadNum { get { return enemyDeadNum; } } // 管理道具 private List stagePropList; private AudioSource audioSource; // 气球生成时间 private float balloonTime; // 遗留箭矢list private List stayArrowList; #endregion #region Functions public void Init() { stayArrowList = new List(); //RestartLevel(); audioSource = GameObject.Find("ProcessAudioSource").GetComponent(); InitStageProp(); RestartLevel(); // init 存所有pos 所有obj restart destroyAll create addComponent } public void AddStayArrow(GameObject arrowObj) { stayArrowList.Add(arrowObj); } private void ResetStayArrows() { if (stayArrowList != null && stayArrowList.Count > 0) { for (int i = stayArrowList.Count - 1; i >= 0; i--) { GameObject.Destroy(stayArrowList[i]); stayArrowList.RemoveAt(i); } } stayArrowList = new List(); } /// /// 初始化list 存放所有道具 /// private void InitStageProp() { stagePropList = new List(); Transform trans = GameObject.Find("BarrelTrans").transform; for (int i = 0; i < trans.childCount; i++) { stagePropList.Add(trans.GetChild(i).GetComponent()); } } /// /// 重置所有道具 /// private void ResetStagePorperty() { foreach (var item in stagePropList) { if (item != null) { item.ResetProp(); } } } /// /// 关卡重开 /// public void RestartLevel() { isOver = false; Vector2 ballSpawn = GameModule.GetInstance().GetDoubleParams("balloonSpawnTime"); balloonTime = Random.Range(ballSpawn.x, ballSpawn.y); ChangeLevel(0); EnemyManager.GetInstance().CreateEnemy(1, -1); } private bool isOver = false; private bool ableChanged = false; /// /// 切换新关卡 /// /// public void ChangeLevel(int curr) { currLevel = curr; // 重开或开始游戏 if (curr == 0 || curr == 1) { // 重置道具 ResetStagePorperty(); ResetStayArrows(); GameMananger.GetInstance().barrelTriggerCount = 0; } // 判断是否为初始关卡 if (curr <= 0) { enemyDeadNum = 0; UIManager.GetInstance().SetDefaultProcess(false); } else { ResetStayArrows(); // 关卡开启时播放 audioSource.clip = Resources.Load("Voice/Process/Change"); if (UserSettings.ins.openEffect) audioSource.Play(); // ui change UIManager.GetInstance().SetDefaultProcess(true); // 通关判断 if (currLevel > ProcessModule.GetInstance().processDataDic.Count) { // 通关 GameMananger.GetInstance().GameOver(true); } // 新关卡属性初始化 currMonsterIndex = 0; configData = ProcessModule.GetInstance().GetData(currLevel); currLevelTime = 0; enemyDeadNum = 0; } } private float processInterval = 0; public void Update() { if (currLevel <= 0) { // 初始关卡在随机时间生成气球 if (balloonTime <= 0) { GameObject balloon = BalloonPool.GetInstance().GetGameObject(); // 生成位置随机道具后 Transform target = stagePropList[Random.Range(0, stagePropList.Count - 1)].transform; // 气球初始化 balloon.transform.position = new Vector3(target.position.x, target.position.y, target.position.z) + Vector3.forward * 5; balloon.SetActive(true); Vector2 ballSpawn = GameModule.GetInstance().GetDoubleParams("balloonSpawnTime"); balloonTime = Random.Range(ballSpawn.x, ballSpawn.y); } else { balloonTime -= Time.deltaTime; } // 初始关小怪死亡 if (enemyDeadNum == 1) { ChangeLevel(++currLevel); } } else { // 关卡间隔 if (processInterval > 0) { processInterval -= Time.deltaTime; return; } else { if (ableChanged) { ChangeLevel(++currLevel); ableChanged = false; return; } } if (currLevel > ProcessModule.GetInstance().processDataDic.Count) return; currLevelTime += Time.deltaTime; if (currMonsterIndex + 1 <= configData.monsterId.Count && currLevelTime >= configData.refreshTime[currMonsterIndex]) { // 生成怪物 随机路径组 Enemy中组内随机路线 int weight = WeightRandomUtils.GetInstance().GetRandomId(configData.weight[currMonsterIndex]); EnemyManager.GetInstance().CreateEnemy(configData.monsterId[currMonsterIndex], weight); currMonsterIndex++; } // 当前关卡怪物死光 if (enemyDeadNum == configData.monsterId.Count) { processInterval = GameModule.GetInstance().GetData("processInterval"); ableChanged = true; //ChangeLevel(++currLevel); } } } /// /// 怪物死亡通知关卡类 /// public void EnemyDead() { enemyDeadNum++; if (currLevel <= 0) return; if (enemyDeadNum >= configData.monsterId.Count) return; if (EnemyManager.GetInstance().enemyList.Count <= 0 && currLevelTime <= configData.refreshTime[enemyDeadNum]) { currLevelTime = configData.refreshTime[enemyDeadNum]; //currMonsterIndex++; } } /// /// 游戏结束 /// /// public void GameOver(bool isWin) { if (isOver) return; audioSource.clip = Resources.Load($"Voice/Process/" + (isWin ? "Success" : "Defeat")); if (UserSettings.ins.openEffect) audioSource.Play(); isOver = true; } #endregion } }