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
}
}