OneShotOneKill/Assets/Script/InGame/IngameMgr.cs

172 lines
5.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class IngameMgr : MonoBehaviourSingletonTemplate<IngameMgr>
{
[Header("UI")]
public TextMeshProUGUI[] texts_money; // 0 코인, 1 아이템, 2 웨이브
public Text t_timer, t_hp, t_exp;
public Slider slider_wave, slider_exp;
[Header("Monster")]
public Transform[] tfs_mobparent;
public Transform tf_hudparent;
[Header("Fence")]
public Transform tf_fence;
int m_Wave, m_HP, m_Coin, m_Item, m_Lv, m_Exp;
StageConfigTableData CurStageData;
UnitTableData CurUnitData;
Dictionary<string, List<MobActor>> mob_pools = new Dictionary<string, List<MobActor>>();
float f_Time;
private void OnEnable()
{
foreach (var kv in mob_pools) foreach (var mob in kv.Value) mob.Off();
CurStageData = table_stageconfig.Ins.Get_Data(10001);
CurUnitData = table_unit.Ins.Get_Data(1001);
m_HP = CurUnitData.n_DefaultHp;
m_Lv = m_Wave = 1;
m_Exp = m_Coin = m_Item = 0;
f_Time = 90f;
Set_Texts();
StartCoroutine(Co_MakeMob());
}
private void Update()
{
Set_Timer();
}
public void ReturnMob(MobActor mob)
{
mob.gameObject.SetActive(false);
}
void Set_Texts()
{
texts_money[0].text = m_Coin.ToString();
texts_money[1].text = m_Item.ToString();
texts_money[2].text = $"Wave {(m_Wave > CurStageData.n_MaxWave ? CurStageData.n_MaxWave : m_Wave)}/{CurStageData.n_MaxWave}";
slider_wave.value = (m_Wave - 1) / (float)CurStageData.n_MaxWave;
t_hp.text = m_HP.ToString();
slider_exp.value = 0f;
}
void Set_Timer()
{
if (f_Time > 0)
{
f_Time -= Time.deltaTime;
t_timer.text = DSUtil.Get_TimeText_MS(f_Time);
if(f_Time <= 0f)
{
GameUI.Ins.Set_UI(7);
}
}
}
IEnumerator Co_MakeMob()
{
var wavedata = table_wavepattern.Ins.Get_Data(CurStageData.n_WavePatternGroupID, m_Wave);
if (wavedata == null)
{ // 클리어
yield break;
}
// 일반 몬스터 생성
int meleemobcount = 0, rangemobcount = 0;
var totalmobcount = wavedata.n_AppearMeleeMonster + wavedata.n_AppearRangeMonster;
for (int i = 0; i < totalmobcount; i++)
{
yield return new WaitForSeconds(wavedata.f_AppearDelay);
for (int j = 0; j < wavedata.n_OverlapUnitCount; j++)
{ // 근거리 or 원거리 몹 생성 후 카운팅
if (totalmobcount < meleemobcount + rangemobcount) break;
bool canMelee = meleemobcount < wavedata.n_AppearMeleeMonster;
bool canRange = rangemobcount < wavedata.n_AppearRangeMonster;
if (!canMelee && !canRange)
continue;
bool meleemob;
if (canMelee && canRange)
meleemob = Random.Range(0, 2) == 0;
else
meleemob = canMelee;
int mobid = 0;
if (meleemob && meleemobcount < wavedata.n_AppearMeleeMonster)
{
++meleemobcount;
mobid = CurStageData.list_monster_melee[Random.Range(0, CurStageData.list_monster_melee.Count)];
}
else if(!meleemob && rangemobcount < wavedata.n_AppearRangeMonster)
{
++rangemobcount;
mobid = CurStageData.list_monster_range[Random.Range(0, CurStageData.list_monster_range.Count)];
}
MakeMob(false, table_monster.Ins.Get_Data(mobid));
}
}
if (CurStageData.dic_boss.ContainsKey(m_Wave))
MakeMob(true, table_monster.Ins.Get_Data(CurStageData.dic_boss[m_Wave]));
yield return new WaitForSeconds(wavedata.f_NextWaveDelay);
++m_Wave;
Set_Texts();
StartCoroutine(Co_MakeMob());
}
void MakeMob(bool isboss, MonsterTableData data)
{
string key = data.s_MonsterPrefabPath;
if (!mob_pools.ContainsKey(key))
mob_pools.Add(key, new List<MobActor>());
MobActor mob = null;
for (int i = 0; i < mob_pools[key].Count; i++)
{
if (!mob_pools[key][i].gameObject.activeInHierarchy)
{
mob = mob_pools[key][i];
break;
}
}
if (mob == null)
{
mob = DSUtil.Get_Clone<MobActor>(key);
mob_pools[key].Add(mob);
mob.SetOwner(this, key);
}
mob.transform.SetParent(tfs_mobparent[Random.Range(0, tfs_mobparent.Length)], false);
mob.transform.localPosition = Vector3.zero;
mob.transform.localScale = Vector3.one * data.f_Scale;
mob.Set(isboss,data, tf_fence.position.y);
}
public void Get_Dmg(int dmg)
{
m_HP -= dmg;
Set_Texts();
if (m_HP < 0) GameUI.Ins.Set_UI(7);
}
public StageConfigTableData Get_CurStageTData() { return CurStageData; }
public UnitTableData Get_CurUnitTData() { return CurUnitData; }
}