몹 생성 로직 수정, pc 인게임 상태 표시 수정
This commit is contained in:
parent
9cf145f861
commit
2a9396b090
|
|
@ -62,5 +62,7 @@ messageinfo 엄청 느린 버그
|
|||
- 일꾼 이속, RND_SKILL
|
||||
몬스터 골드, 아이템 드랍
|
||||
상태 이상 ui 표시
|
||||
- https://www.notion.so/devlucas/c4dc5df0d9d64c95963c6e540acdca7c#e3ef07bc84ff424790bb723835bbce87
|
||||
- Boss
|
||||
//- Pet
|
||||
//- PC
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -22,87 +22,95 @@ public class MobControlMgr : MyCoroutine
|
|||
if (!DSUtil.CheckNull(m_MonsterAppearData))
|
||||
{
|
||||
text_lv.text = DSUtil.Format("Lv.{0}", m_MonsterAppearData.n_AppearMonsterLv);
|
||||
var list_make_mobs = new List<MonsterTableData>();
|
||||
switch (m_MonsterAppearData.e_SpawnerType)
|
||||
{ // 생성할 몹 정보
|
||||
case eSpawnerType.Random: // s_AppearMonsterID에 지정된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 내 랜덤으로 생성되는 방식
|
||||
for (int i = 0; i < m_MonsterAppearData.n_MaxMonsterCount * 2; i++)
|
||||
list_make_mobs.Add(m_MonsterAppearData.Get_MobData_orNull());
|
||||
dic_actors.Add(0, new List<Actor>());
|
||||
break;
|
||||
case eSpawnerType.Order: // s_AppearMonsterID에 지정 된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 내 순서대로 생성되는 방식 (예: 1001|1002|1003 → 1001|1002|1003 → 순서를 반복해 생성)
|
||||
int index = 0;
|
||||
for (int i = 0; i < m_MonsterAppearData.n_MaxMonsterCount * 2; i++)
|
||||
{
|
||||
list_make_mobs.Add(m_MonsterAppearData.Get_MobData_orNull(index));
|
||||
++index;
|
||||
if (index >= m_MonsterAppearData.Get_MobTypeCount()) index = 0;
|
||||
}
|
||||
dic_actors.Add(0, new List<Actor>());
|
||||
orderIndex = m_MonsterAppearData.n_MaxMonsterCount - 1;
|
||||
break;
|
||||
case eSpawnerType.Phase:
|
||||
// s_AppearMonsterID에 지정 된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 한 종류씩 순차적으로 생성되는 방식
|
||||
// (예: 1001|1002|1003일 경우 1001번 몬스터가 사망하면 1002번 몬스터가 n_MaxMonsterCount 만큼 f_SpawnerDelay 후 생성)
|
||||
case eSpawnerType.PhaseAllKill:
|
||||
// s_AppearMonsterID에 지정 된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 한 종류씩 순차적으로 생성되고, 모든 몬스터가 제거되면 다음 페이즈가 발생되는 방식 (※주로 컨텐츠에서 활용될 예정)
|
||||
// (예: 1001|1002|1003일 경우 1001번 몬스터를 전부 제거해야 1002번 몬스터가 n_MaxMonsterCount 만큼 f_SpawnerDelay 후 일괄 생성)
|
||||
for (int i = 0; i < m_MonsterAppearData.Get_MobTypeCount(); i++)
|
||||
{
|
||||
dic_actors.Add(i, new List<Actor>());
|
||||
for (int j = 0; j < m_MonsterAppearData.n_MaxMonsterCount; j++)
|
||||
list_make_mobs.Add(m_MonsterAppearData.Get_MobData_orNull(i));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
int makemobcount = 0;
|
||||
var list_make_mobs = Get_Mobs();
|
||||
for (int i = 0; i < list_make_mobs.Count; i++)
|
||||
{
|
||||
int indexCopy = i; // 현재 i 값을 지역 변수에 저장하여 안전하게 캡처
|
||||
var rdnpos = DSUtil.Get_RandomPos_onNavMesh(transform.position, 0f, MobGenRange);
|
||||
var mobData = list_make_mobs[indexCopy];
|
||||
|
||||
AddrResourceMgr.Ins.LoadObject<GameObject>(mobData.s_MonsterPrefab, handle =>
|
||||
{
|
||||
var mob = DSUtil.Get_Clone<MobActor>(handle.Result, transform);
|
||||
AddrResourceMgr.Ins.Set_AddressableReleaseSelf(mob.gameObject);
|
||||
ActorInfo.Ins.Add_Actor(mob, eRole.Mob, SpawnerID, mobData.s_MonsterPrefab);
|
||||
|
||||
switch (m_MonsterAppearData.e_SpawnerType)
|
||||
{
|
||||
case eSpawnerType.Random:
|
||||
case eSpawnerType.Order:
|
||||
dic_actors[0].Add(mob);
|
||||
break;
|
||||
case eSpawnerType.Phase:
|
||||
case eSpawnerType.PhaseAllKill:
|
||||
var list_ids = m_MonsterAppearData.Get_MobIds();
|
||||
int findindex = list_ids.FindIndex(f => f == list_make_mobs[indexCopy].n_MonsterID);
|
||||
if (findindex >= 0 && findindex < dic_actors.Count) // 인덱스가 유효한지 체크
|
||||
dic_actors[findindex].Add(mob);
|
||||
else
|
||||
Debug.LogError($"Invalid findindex: {findindex}, MonsterID: {list_make_mobs[indexCopy].n_MonsterID}");
|
||||
break;
|
||||
}
|
||||
|
||||
mob.Set(true, null, null, m_MonsterAppearData.n_SpawnerID, false);
|
||||
mob.Set(mobData, rdnpos, actDie, indexCopy);
|
||||
mob.Off();
|
||||
mob.MagicID = 0;
|
||||
|
||||
++makemobcount;
|
||||
});
|
||||
var mobData = list_make_mobs[i];
|
||||
yield return StartCoroutine(Make_Mob(mobData, i, rdnpos));
|
||||
}
|
||||
|
||||
while (makemobcount < list_make_mobs.Count) yield return null;
|
||||
|
||||
// 생성한 몬스터를 m_MonsterAppearData.n_MaxMonsterCount 만큼 활성화
|
||||
for (int i = 0; i < m_MonsterAppearData.n_MaxMonsterCount; i++)
|
||||
dic_actors[0][i].On_Regen();
|
||||
}
|
||||
}
|
||||
|
||||
List<MonsterTableData> Get_Mobs()
|
||||
{
|
||||
var list_make_mobs = new List<MonsterTableData>();
|
||||
switch (m_MonsterAppearData.e_SpawnerType)
|
||||
{ // 생성할 몹 정보
|
||||
case eSpawnerType.Random: // s_AppearMonsterID에 지정된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 내 랜덤으로 생성되는 방식
|
||||
for (int i = 0; i < m_MonsterAppearData.n_MaxMonsterCount * 2; i++)
|
||||
list_make_mobs.Add(m_MonsterAppearData.Get_MobData_orNull());
|
||||
dic_actors.Add(0, new List<Actor>());
|
||||
break;
|
||||
case eSpawnerType.Order: // s_AppearMonsterID에 지정 된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 내 순서대로 생성되는 방식 (예: 1001|1002|1003 → 1001|1002|1003 → 순서를 반복해 생성)
|
||||
int index = 0;
|
||||
for (int i = 0; i < m_MonsterAppearData.n_MaxMonsterCount * 2; i++)
|
||||
{
|
||||
list_make_mobs.Add(m_MonsterAppearData.Get_MobData_orNull(index));
|
||||
++index;
|
||||
if (index >= m_MonsterAppearData.Get_MobTypeCount()) index = 0;
|
||||
}
|
||||
dic_actors.Add(0, new List<Actor>());
|
||||
orderIndex = m_MonsterAppearData.n_MaxMonsterCount - 1;
|
||||
break;
|
||||
case eSpawnerType.Phase:
|
||||
// s_AppearMonsterID에 지정 된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 한 종류씩 순차적으로 생성되는 방식
|
||||
// (예: 1001|1002|1003일 경우 1001번 몬스터가 사망하면 1002번 몬스터가 n_MaxMonsterCount 만큼 f_SpawnerDelay 후 생성)
|
||||
case eSpawnerType.PhaseAllKill:
|
||||
// s_AppearMonsterID에 지정 된 몬스터가 n_MaxMonsterCount 수량만큼 Spawner 범위 한 종류씩 순차적으로 생성되고, 모든 몬스터가 제거되면 다음 페이즈가 발생되는 방식 (※주로 컨텐츠에서 활용될 예정)
|
||||
// (예: 1001|1002|1003일 경우 1001번 몬스터를 전부 제거해야 1002번 몬스터가 n_MaxMonsterCount 만큼 f_SpawnerDelay 후 일괄 생성)
|
||||
for (int i = 0; i < m_MonsterAppearData.Get_MobTypeCount(); i++)
|
||||
{
|
||||
dic_actors.Add(i, new List<Actor>());
|
||||
for (int j = 0; j < m_MonsterAppearData.n_MaxMonsterCount; j++)
|
||||
list_make_mobs.Add(m_MonsterAppearData.Get_MobData_orNull(i));
|
||||
}
|
||||
break;
|
||||
}
|
||||
return list_make_mobs;
|
||||
}
|
||||
|
||||
IEnumerator Make_Mob(MonsterTableData mobData, int i, Vector3 rdnpos)
|
||||
{
|
||||
bool makeComplete = false;
|
||||
AddrResourceMgr.Ins.LoadObject<GameObject>(mobData.s_MonsterPrefab, handle =>
|
||||
{
|
||||
var mob = DSUtil.Get_Clone<MobActor>(handle.Result, transform);
|
||||
AddrResourceMgr.Ins.Set_AddressableReleaseSelf(mob.gameObject);
|
||||
ActorInfo.Ins.Add_Actor(mob, eRole.Mob, SpawnerID, mobData.s_MonsterPrefab);
|
||||
|
||||
switch (m_MonsterAppearData.e_SpawnerType)
|
||||
{
|
||||
case eSpawnerType.Random:
|
||||
case eSpawnerType.Order:
|
||||
dic_actors[0].Add(mob);
|
||||
break;
|
||||
case eSpawnerType.Phase:
|
||||
case eSpawnerType.PhaseAllKill:
|
||||
var list_ids = m_MonsterAppearData.Get_MobIds();
|
||||
int findindex = list_ids.FindIndex(f => f == mobData.n_MonsterID);
|
||||
if (findindex >= 0 && findindex < dic_actors.Count) // 인덱스가 유효한지 체크
|
||||
dic_actors[findindex].Add(mob);
|
||||
else
|
||||
Debug.LogError($"Invalid findindex: {findindex}, MonsterID: {mobData.n_MonsterID}");
|
||||
break;
|
||||
}
|
||||
|
||||
mob.Set(true, null, null, m_MonsterAppearData.n_SpawnerID, false);
|
||||
mob.Set(mobData, rdnpos, actDie, i);
|
||||
mob.Off();
|
||||
mob.MagicID = 0;
|
||||
makeComplete = true;
|
||||
});
|
||||
|
||||
while (!makeComplete) yield return null;
|
||||
}
|
||||
|
||||
private void actDie(int mobid)
|
||||
{
|
||||
if (m_MonsterAppearData != null)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
|
|
@ -9,7 +6,7 @@ public class IngameBuffDebuffCard : CardBase
|
|||
public Image i_icon, i_cooltime;
|
||||
|
||||
IngameBuffDebuffData m_Data;
|
||||
float f_Time;
|
||||
float f_MaxTime;
|
||||
|
||||
public override void Set<T>(T _base)
|
||||
{
|
||||
|
|
@ -17,13 +14,15 @@ public class IngameBuffDebuffCard : CardBase
|
|||
m_Data = _base as IngameBuffDebuffData;
|
||||
i_icon.sprite = UIAtlasMgr.Ins.Get_Sprite(m_Data.s_Icon);
|
||||
i_cooltime.fillAmount = 0f;
|
||||
f_Time = m_Data.f_Time;
|
||||
f_MaxTime = m_Data.f_Time;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
f_Time -= Time.deltaTime;
|
||||
i_cooltime.fillAmount = f_Time / m_Data.f_Time;
|
||||
m_Data.f_Time -= Time.deltaTime;
|
||||
i_cooltime.fillAmount = m_Data.f_Time / f_MaxTime;
|
||||
if (m_Data.f_Time <= 0f)
|
||||
gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ public class MyInfoUI : MonoBehaviourSingletonuScrollViewArrMgr<MyInfoUI>
|
|||
|
||||
Set_MainStats();
|
||||
Set_ScrollView(1, list_buffindex, false);
|
||||
Set_ScrollView(2, list_buffDebuffDatas, false);
|
||||
CardBase_AllOff(2);
|
||||
}
|
||||
|
||||
public void Set_HP(double curHP, double maxHP)
|
||||
|
|
@ -75,8 +75,7 @@ public class MyInfoUI : MonoBehaviourSingletonuScrollViewArrMgr<MyInfoUI>
|
|||
}
|
||||
}
|
||||
|
||||
if (!add)
|
||||
list_buffDebuffDatas.Add(new IngameBuffDebuffData { s_Icon = icon, f_Time = time });
|
||||
if (!add) list_buffDebuffDatas.Add(new IngameBuffDebuffData { s_Icon = icon, f_Time = time });
|
||||
|
||||
Set_ScrollView(2, list_buffDebuffDatas, false);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue