using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class IngameMgr : MonoBehaviourSingletonTemplate { [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> mob_pools = new Dictionary>(); 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; Set_Texts(); StartCoroutine(Co_MakeMob()); } 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; } 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)]; } var mobdata = table_monster.Ins.Get_Data(mobid); GetMob(mobdata).Set(mobdata, tf_fence.position.y); } } if (CurStageData.dic_boss.ContainsKey(m_Wave)) { var mobdata = table_monster.Ins.Get_Data(CurStageData.dic_boss[m_Wave]); GetMob(mobdata).Set(mobdata, tf_fence.position.y); } yield return new WaitForSeconds(wavedata.f_NextWaveDelay); ++m_Wave; Set_Texts(); StartCoroutine(Co_MakeMob()); } MobActor GetMob(MonsterTableData data) { string key = data.s_MonsterPrefabPath; if (!mob_pools.ContainsKey(key)) mob_pools.Add(key, new List()); 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(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(data, tf_fence.position.y); return mob; } 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; } }