Compare commits

..

No commits in common. "2313c3d6590e06ecd2c712967d07af785ddb9fed" and "f2619283aa17bd8c4c73530fef55de04643b2854" have entirely different histories.

5 changed files with 24 additions and 106 deletions

View File

@ -1,3 +1,6 @@
액티브 스킬 1종
서포터
빌드 및 테스트 빌드 및 테스트
스킬 카드에 별 표시 스킬 카드에 별 표시

View File

@ -113,7 +113,7 @@ public class MobActor : MonoBehaviour
m_HP = m_Data.n_DefaultHp + (bBoss ? curstagedata.n_DefaultBossHp : curstagedata.n_DefaultEnemyHp); m_HP = m_Data.n_DefaultHp + (bBoss ? curstagedata.n_DefaultBossHp : curstagedata.n_DefaultEnemyHp);
(m_HUD_HP.transform as RectTransform).anchoredPosition = Vector2.one * 10000f; (m_HUD_HP.transform as RectTransform).anchoredPosition = Vector2.one * 10000f;
m_HUD_HP.Set(transform, m_HP); m_HUD_HP.Set(transform, m_HP);
m_MobShields.Set(data, bBoss); m_MobShields.Set(data);
} }
void Move() void Move()

View File

@ -12,12 +12,12 @@ public class MobShield : MonoBehaviour
{ {
m_CrashShield = crashshield; m_CrashShield = crashshield;
m_Mob = mob; m_Mob = mob;
m_SR.sprite = sprites[m_CrashShield ? 0 : 1]; m_SR.sprite = sprites[m_CrashShield ? 1 : 0];
} }
public void Get_Dmg() public void Get_Dmg()
{ {
gameObject.SetActive(!m_CrashShield); gameObject.SetActive(m_CrashShield);
var ImpactArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ImpactArrow); var ImpactArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ImpactArrow);
if (ImpactArrow > 0) if (ImpactArrow > 0)
{ {

View File

@ -5,7 +5,7 @@ public class MobShields : MonoBehaviour
eShieldType shieldType; eShieldType shieldType;
public float rotateSpeed = 180f; // 초당 회전 각도 public float rotateSpeed = 180f; // 초당 회전 각도
public void Set(MonsterTableData data, bool isBoss) public void Set(MonsterTableData data)
{ {
transform.localEulerAngles = Vector3.zero; transform.localEulerAngles = Vector3.zero;
shieldType = data.e_ShieldType; shieldType = data.e_ShieldType;
@ -17,114 +17,32 @@ public class MobShields : MonoBehaviour
break; break;
case eShieldType.Static: case eShieldType.Static:
case eShieldType.Rotation: case eShieldType.Rotation:
Make_Shield(data, isBoss); Make_Shield(data);
break; break;
} }
} }
void Make_Shield(MonsterTableData data, bool isBoss) void Make_Shield(MonsterTableData data)
{ {
// 기존 실드 초기화 (비활성화)
var shields = GetComponentsInChildren<MobShield>(true);
for (int i = 0; i < shields.Length; i++)
{
shields[i].gameObject.SetActive(false);
}
gameObject.SetActive(true); gameObject.SetActive(true);
float radius = 2.5f; int crash = data.n_NormalShieldCount;
int noncrash = data.n_InvinityShieldCount;
// 보스 로직: 1 Unbreakable (180도), 4 Breakable (나머지 랜덤) int index = 0;
if (isBoss) while (index < crash + noncrash)
{ {
// 8방향: 0, 45, 90, 135, 180, 225, 270, 315 var shield = DSUtil.Get_Clone<MobShield>("Mob/MobShield", transform, Vector3.one * 10000f);
// 180도는 인덱스 4 (4 * 45 = 180) switch (index)
int unbreakableIndex = 4;
System.Collections.Generic.List<int> availableIndices = new System.Collections.Generic.List<int>() { 0, 1, 2, 3, 5, 6, 7 };
// 무적 실드 생성 (180도)
CreateShield(unbreakableIndex, false, radius);
// 파괴 가능 실드 4개 생성 (나머지 랜덤)
for (int i = 0; i < 4; i++)
{ {
if (availableIndices.Count == 0) break; case 0: shield.transform.localPosition = Vector3.down * 2.5f; break;
int randIdx = Random.Range(0, availableIndices.Count); case 1: shield.transform.localPosition = Vector3.up * 2.5f; break;
int angleIndex = availableIndices[randIdx]; case 2: shield.transform.localPosition = Vector3.right * 2.5f; break;
availableIndices.RemoveAt(randIdx); case 3: shield.transform.localPosition = Vector3.left * 2.5f; break;
CreateShield(angleIndex, true, radius);
} }
shield.Set(index++ < crash, GetComponentInParent<MobActor>());
} }
else // 일반 몬스터 로직
{
int crash = data.n_NormalShieldCount;
int noncrash = data.n_InvinityShieldCount;
int total = crash + noncrash;
// 8방향 인덱스 풀
System.Collections.Generic.List<int> weightedIndices = new System.Collections.Generic.List<int>();
// 180도 (인덱스 4) - 80% 확률, 나머지 - 20% 확률 (각 ~2.8%)?
// 요구사항: 180도 위치가 80% 확률이고, 나머지 방향은 20% 확률
// 간단하게 구현하기 위해, 180도(인덱스 4)를 많이 넣고 나머지를 적게 넣어서 추첨 풀을 만드는 방식보다는
// "위치 결정" 로직을 따로 짭니다.
// 하지만 여러 개의 실드를 배치해야 하므로, "이미 배치된 위치"를 제외하고 뽑아야 합니다.
System.Collections.Generic.List<int> availableIndices = new System.Collections.Generic.List<int>() { 0, 1, 2, 3, 4, 5, 6, 7 };
for (int i = 0; i < total; i++)
{
if (availableIndices.Count == 0) break;
int selectedIndex = -1;
// 180도(인덱스 4)가 아직 가용하다면 확률 적용
if (availableIndices.Contains(4))
{
// 80% 확률로 180도 선택
if (Random.value < 0.8f)
{
selectedIndex = 4;
}
else
{
// 나머지 중에서 랜덤
// 180도를 잠시 제외하고 뽑기
var others = new System.Collections.Generic.List<int>(availableIndices);
others.Remove(4);
if (others.Count > 0)
{
selectedIndex = others[Random.Range(0, others.Count)];
}
else
{
selectedIndex = 4; // 뽑을게 180도 밖에 없으면 그거라도
}
}
}
else
{
// 180도가 이미 뽑혔으면 그냥 나머지 중에서 랜덤
selectedIndex = availableIndices[Random.Range(0, availableIndices.Count)];
}
availableIndices.Remove(selectedIndex);
// 파괴 가능 여부: 앞쪽이 crash, 뒤쪽이 noncrash (기존 로직 유지)
bool isCrashShield = i < crash;
CreateShield(selectedIndex, isCrashShield, radius);
}
}
}
void CreateShield(int angleIndex, bool isCrash, float radius)
{
var shield = DSUtil.Get_Clone<MobShield>("Mob/MobShield", transform, Vector3.one * 10000f);
float angle = angleIndex * 45f * Mathf.Deg2Rad;
Vector3 pos = new Vector3(Mathf.Cos(angle), Mathf.Sin(angle), 0f) * radius;
shield.transform.localPosition = pos;
shield.Set(isCrash, GetComponentInParent<MobActor>());
} }
private void Update() private void Update()

View File

@ -23,12 +23,9 @@ public class SupporterActor : MonoBehaviour
{ {
attackCoolTime = MaxAttackCoolTime; attackCoolTime = MaxAttackCoolTime;
var mob = IngameMgr.Ins.FindNearestMob(transform.position, null); var mob = IngameMgr.Ins.FindNearestMob(transform.position, null);
if (mob != null) UpdateAngle(mob.transform.position);
{ m_PD.tf_Start = transform;
UpdateAngle(mob.transform.position); ProjectileMgr.Ins.Shoot_Projectile(m_PD);
m_PD.tf_Start = transform;
ProjectileMgr.Ins.Shoot_Projectile(m_PD);
}
} }
} }