diff --git a/Assets/OneShotOneKill.txt b/Assets/OneShotOneKill.txt index 9f0986c..4f294e3 100644 --- a/Assets/OneShotOneKill.txt +++ b/Assets/OneShotOneKill.txt @@ -1,7 +1,7 @@ 스킬 15종 //HpUp 적에게 버틸 수 있는 성벽의 생명력이 증가합니다. //AttackUp 공격력이 +1 증가합니다. -PreviousArrow 투사체 타격 횟수가 +1 증가합니다. +//PreviousArrow 투사체 타격 횟수가 +1 증가합니다. DiagonalArrow 발사 된 투사체 방향으로 사선 방향의 투사체 1개가 추가됩니다. ProjectilePierce 투사체가 적을 관통하는 횟수가 증가합니다. //Reflect 투사체 반사 횟수가 +1 증가합니다. diff --git a/Assets/ResWork/Table/Export/Monster.json b/Assets/ResWork/Table/Export/Monster.json index 2f39afb..ffcba20 100644 --- a/Assets/ResWork/Table/Export/Monster.json +++ b/Assets/ResWork/Table/Export/Monster.json @@ -1 +1 @@ -[{"n_MonsterTypeID":"2001","e_MonsterType":"Monster","n_DefaultAttack":"10","n_DefaultHp":"40","n_DropExp":"1","e_UnityType":"Melee","f_AttackRange":"1.2","f_AttackDelay":"1.1","f_MoveSpeed":"1","e_MoveType":"Static","n_ProjectileID":"3101","s_MonsterPrefabPath":"2001","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2002","e_MonsterType":"Monster","n_DefaultAttack":"20","n_DefaultHp":"60","n_DropExp":"1","e_UnityType":"Range","f_AttackRange":"5","f_AttackDelay":"2","f_MoveSpeed":"1.2","e_MoveType":"Static","n_ProjectileID":"3102","s_MonsterPrefabPath":"2002","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2003","e_MonsterType":"Boss","n_DefaultAttack":"30","n_DefaultHp":"60","n_DropExp":"3","e_UnityType":"Melee","f_AttackRange":"2","f_AttackDelay":"1.5","f_MoveSpeed":"1.2","e_MoveType":"Random","n_ProjectileID":"3101","s_MonsterPrefabPath":"2003","f_Scale":"0.3","e_ShieldType":"Rotation","n_NormalShieldCount":"1","n_InvinityShieldCount":"1"},{"n_MonsterTypeID":"2004","e_MonsterType":"Monster","n_DefaultAttack":"10","n_DefaultHp":"40","n_DropExp":"1","e_UnityType":"Melee","f_AttackRange":"1.2","f_AttackDelay":"1.1","f_MoveSpeed":"1","e_MoveType":"Static","n_ProjectileID":"3101","s_MonsterPrefabPath":"2004","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2005","e_MonsterType":"Monster","n_DefaultAttack":"20","n_DefaultHp":"60","n_DropExp":"1","e_UnityType":"Range","f_AttackRange":"5","f_AttackDelay":"2","f_MoveSpeed":"1.2","e_MoveType":"Static","n_ProjectileID":"3102","s_MonsterPrefabPath":"2005","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2006","e_MonsterType":"Boss","n_DefaultAttack":"30","n_DefaultHp":"60","n_DropExp":"3","e_UnityType":"Range","f_AttackRange":"4.5","f_AttackDelay":"1.5","f_MoveSpeed":"1.2","e_MoveType":"Random","n_ProjectileID":"3102","s_MonsterPrefabPath":"2006","f_Scale":"0.3","e_ShieldType":"Rotation","n_NormalShieldCount":"1","n_InvinityShieldCount":"1"}] \ No newline at end of file +[{"n_MonsterTypeID":"2001","e_MonsterType":"Monster","n_DefaultAttack":"10","n_DefaultHp":"40","n_DropExp":"1","e_UnityType":"Melee","f_AttackRange":"1.2","f_AttackDelay":"1.1","f_MoveSpeed":"0.5","e_MoveType":"Static","n_ProjectileID":"3101","s_MonsterPrefabPath":"2001","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2002","e_MonsterType":"Monster","n_DefaultAttack":"20","n_DefaultHp":"60","n_DropExp":"1","e_UnityType":"Range","f_AttackRange":"5","f_AttackDelay":"2","f_MoveSpeed":"0.5","e_MoveType":"Static","n_ProjectileID":"3102","s_MonsterPrefabPath":"2002","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2003","e_MonsterType":"Boss","n_DefaultAttack":"30","n_DefaultHp":"60","n_DropExp":"3","e_UnityType":"Melee","f_AttackRange":"2","f_AttackDelay":"1.5","f_MoveSpeed":"1","e_MoveType":"Random","n_ProjectileID":"3101","s_MonsterPrefabPath":"2003","f_Scale":"0.3","e_ShieldType":"Rotation","n_NormalShieldCount":"1","n_InvinityShieldCount":"1"},{"n_MonsterTypeID":"2004","e_MonsterType":"Monster","n_DefaultAttack":"10","n_DefaultHp":"40","n_DropExp":"1","e_UnityType":"Melee","f_AttackRange":"1.2","f_AttackDelay":"1.1","f_MoveSpeed":"0.5","e_MoveType":"Static","n_ProjectileID":"3101","s_MonsterPrefabPath":"2004","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2005","e_MonsterType":"Monster","n_DefaultAttack":"20","n_DefaultHp":"60","n_DropExp":"1","e_UnityType":"Range","f_AttackRange":"5","f_AttackDelay":"2","f_MoveSpeed":"0.5","e_MoveType":"Static","n_ProjectileID":"3102","s_MonsterPrefabPath":"2005","f_Scale":"0.15","e_ShieldType":"None","n_NormalShieldCount":"2","n_InvinityShieldCount":"2"},{"n_MonsterTypeID":"2006","e_MonsterType":"Boss","n_DefaultAttack":"30","n_DefaultHp":"60","n_DropExp":"3","e_UnityType":"Range","f_AttackRange":"4.5","f_AttackDelay":"1.5","f_MoveSpeed":"1","e_MoveType":"Random","n_ProjectileID":"3102","s_MonsterPrefabPath":"2006","f_Scale":"0.3","e_ShieldType":"Rotation","n_NormalShieldCount":"1","n_InvinityShieldCount":"1"}] \ No newline at end of file diff --git a/Assets/ResWork/Table/Export/Unit.json b/Assets/ResWork/Table/Export/Unit.json index 09ab099..e52a0ba 100644 --- a/Assets/ResWork/Table/Export/Unit.json +++ b/Assets/ResWork/Table/Export/Unit.json @@ -1 +1 @@ -[{"n_UnitID":"1001","n_DefaultAttack":"25","n_DefaultHp":"2000","f_AttackSpeed":"1.25","n_DefaultProjectileCount":"1","n_ProjectileID":"3001","s_UnitPrefabPath":"DefaultUnit"}] \ No newline at end of file +[{"n_UnitID":"1001","n_DefaultAttack":"25","n_DefaultHp":"999999","f_AttackSpeed":"1.25","n_DefaultProjectileCount":"1","n_ProjectileID":"3001","s_UnitPrefabPath":"DefaultUnit"}] \ No newline at end of file diff --git a/Assets/ResWork/Table/Export/WavePattern.json b/Assets/ResWork/Table/Export/WavePattern.json index 40dc0e1..87aa703 100644 --- a/Assets/ResWork/Table/Export/WavePattern.json +++ b/Assets/ResWork/Table/Export/WavePattern.json @@ -1 +1 @@ -[{"n_PatternID":"1001","n_AppearWave":"1","n_AppearMeleeMonster":"14","n_AppearRangeMonster":"0","f_AppearDelay":"0.5","n_OverlapUnitCount":"1","f_NextWaveDelay":"3.5"},{"n_PatternID":"1001","n_AppearWave":"2","n_AppearMeleeMonster":"20","n_AppearRangeMonster":"5","f_AppearDelay":"0.35","n_OverlapUnitCount":"1","f_NextWaveDelay":"2.5"},{"n_PatternID":"1001","n_AppearWave":"3","n_AppearMeleeMonster":"30","n_AppearRangeMonster":"10","f_AppearDelay":"0.2","n_OverlapUnitCount":"2","f_NextWaveDelay":"2.5"},{"n_PatternID":"1002","n_AppearWave":"1","n_AppearMeleeMonster":"10","n_AppearRangeMonster":"0","f_AppearDelay":"0.5","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1002","n_AppearWave":"2","n_AppearMeleeMonster":"27","n_AppearRangeMonster":"4","f_AppearDelay":"0.35","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1002","n_AppearWave":"3","n_AppearMeleeMonster":"40","n_AppearRangeMonster":"10","f_AppearDelay":"0.2","n_OverlapUnitCount":"3","f_NextWaveDelay":"3"},{"n_PatternID":"1003","n_AppearWave":"1","n_AppearMeleeMonster":"10","n_AppearRangeMonster":"0","f_AppearDelay":"0.5","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1003","n_AppearWave":"2","n_AppearMeleeMonster":"27","n_AppearRangeMonster":"4","f_AppearDelay":"0.35","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1003","n_AppearWave":"3","n_AppearMeleeMonster":"40","n_AppearRangeMonster":"10","f_AppearDelay":"0.2","n_OverlapUnitCount":"3","f_NextWaveDelay":"3"}] \ No newline at end of file +[{"n_PatternID":"1001","n_AppearWave":"1","n_AppearMeleeMonster":"14","n_AppearRangeMonster":"0","f_AppearDelay":"2","n_OverlapUnitCount":"1","f_NextWaveDelay":"3.5"},{"n_PatternID":"1001","n_AppearWave":"2","n_AppearMeleeMonster":"20","n_AppearRangeMonster":"5","f_AppearDelay":"2","n_OverlapUnitCount":"1","f_NextWaveDelay":"2.5"},{"n_PatternID":"1001","n_AppearWave":"3","n_AppearMeleeMonster":"30","n_AppearRangeMonster":"10","f_AppearDelay":"2","n_OverlapUnitCount":"2","f_NextWaveDelay":"2.5"},{"n_PatternID":"1002","n_AppearWave":"1","n_AppearMeleeMonster":"10","n_AppearRangeMonster":"0","f_AppearDelay":"0.5","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1002","n_AppearWave":"2","n_AppearMeleeMonster":"27","n_AppearRangeMonster":"4","f_AppearDelay":"0.35","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1002","n_AppearWave":"3","n_AppearMeleeMonster":"40","n_AppearRangeMonster":"10","f_AppearDelay":"0.2","n_OverlapUnitCount":"3","f_NextWaveDelay":"3"},{"n_PatternID":"1003","n_AppearWave":"1","n_AppearMeleeMonster":"10","n_AppearRangeMonster":"0","f_AppearDelay":"0.5","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1003","n_AppearWave":"2","n_AppearMeleeMonster":"27","n_AppearRangeMonster":"4","f_AppearDelay":"0.35","n_OverlapUnitCount":"2","f_NextWaveDelay":"3"},{"n_PatternID":"1003","n_AppearWave":"3","n_AppearMeleeMonster":"40","n_AppearRangeMonster":"10","f_AppearDelay":"0.2","n_OverlapUnitCount":"3","f_NextWaveDelay":"3"}] \ No newline at end of file diff --git a/Assets/ResWork/Table/OneShotOneKill.xlsm b/Assets/ResWork/Table/OneShotOneKill.xlsm index c6bfbd5..d6c0e26 100644 Binary files a/Assets/ResWork/Table/OneShotOneKill.xlsm and b/Assets/ResWork/Table/OneShotOneKill.xlsm differ diff --git a/Assets/Script/InGame/Actor/AimArrowController.cs b/Assets/Script/InGame/Actor/AimArrowController.cs index 6139fbe..da41415 100644 --- a/Assets/Script/InGame/Actor/AimArrowController.cs +++ b/Assets/Script/InGame/Actor/AimArrowController.cs @@ -46,50 +46,51 @@ public class AimArrowController : MonoBehaviour } void Shoot() - { - if (IngameMgr.Ins.Get_SkillValue(eSkillType.PreviousArrow) > 0) - Shoot_PreviousArrow(); - else - Shoot_Normal(); - } - - void Shoot_Normal() { var unit = IngameMgr.Ins.Get_CurUnitTData(); - var attack = unit.n_DefaultAttack + IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp); - ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData + + ProjectileData basePd = new ProjectileData { IsPC = true, m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID), tf_Start = arrow.transform, - PreviousArrow = 0, - Dmg = (int)attack - }); - } + Dmg = unit.n_DefaultAttack + (int)IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp), - void Shoot_PreviousArrow() - { - var unit = IngameMgr.Ins.Get_CurUnitTData(); - var attack = unit.n_DefaultAttack + IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp); + PreviousArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.PreviousArrow), + DiagonalArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.DiagonalArrow), - int prev = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.PreviousArrow); - int total = prev + 1; + ArrowLeftRight = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ArrowLeftRight), + ArrowUpDown = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ArrowUpDown), + Bounce = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.Bounce) + }; - for (int i = 0; i < total; i++) + int lineCnt = 1 + basePd.PreviousArrow; + int diagCnt = 1 + basePd.DiagonalArrow; + + for (int l = 0; l < lineCnt; l++) { - ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData + for (int d = 0; d < diagCnt; d++) { - IsPC = true, - PreviousArrow = prev, - ArrowIndex = i, - m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID), - tf_Start = arrow.transform, - Dmg = (int)attack - }); + ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData + { + LineIndex = l, + DiagIndex = d, + PreviousArrow = basePd.PreviousArrow, + DiagonalArrow = basePd.DiagonalArrow, + + ArrowLeftRight = basePd.ArrowLeftRight, + ArrowUpDown = basePd.ArrowUpDown, + Bounce = basePd.Bounce, + + IsPC = basePd.IsPC, + m_Data = basePd.m_Data, + tf_Start = basePd.tf_Start, + Dmg = basePd.Dmg + }); + } } } - void UpdateArrow(Vector2 currentPos) { Vector2 dir = currentPos - (Vector2)arrow.transform.position; diff --git a/Assets/Script/InGame/Actor/MobActor.cs b/Assets/Script/InGame/Actor/MobActor.cs index 13f815e..109e445 100644 --- a/Assets/Script/InGame/Actor/MobActor.cs +++ b/Assets/Script/InGame/Actor/MobActor.cs @@ -145,6 +145,8 @@ public class MobActor : MonoBehaviour m_HUD_HP.Set(m_HP); if (m_HP <= 0) { + if (m_State == eMobState.Die) return; + m_State = eMobState.Die; IngameMgr.Ins.Add_MobKill(m_Data.n_DropExp); gameObject.SetActive(false); diff --git a/Assets/Script/InGame/IngameMgr.cs b/Assets/Script/InGame/IngameMgr.cs index 04503c0..d583f14 100644 --- a/Assets/Script/InGame/IngameMgr.cs +++ b/Assets/Script/InGame/IngameMgr.cs @@ -168,7 +168,6 @@ public class IngameMgr : MonoBehaviourSingletonTemplate Set_Texts(); StartCoroutine(Co_MakeMob()); } - void MakeMob(bool isboss, MonsterTableData data) { string key = data.s_MonsterPrefabPath; @@ -198,6 +197,37 @@ public class IngameMgr : MonoBehaviourSingletonTemplate mob.transform.localScale = Vector3.one * data.f_Scale; mob.Set(isboss,data, tf_fence.position.y); } + public MobActor FindNearestMob(Vector3 pos, MobActor ignore) + { + MobActor nearest = null; + float minDistSq = float.MaxValue; + + foreach (var kv in mob_pools) + { + List list = kv.Value; + + for (int i = 0; i < list.Count; i++) + { + MobActor mob = list[i]; + + if (!mob.gameObject.activeInHierarchy) + continue; + + if (mob == ignore) + continue; + + float distSq = (mob.transform.position - pos).sqrMagnitude; + + if (distSq < minDistSq) + { + minDistSq = distSq; + nearest = mob; + } + } + } + + return nearest; + } public void Get_Dmg(int dmg) { diff --git a/Assets/Script/InGame/Projectile/Projectile.cs b/Assets/Script/InGame/Projectile/Projectile.cs index 9176830..cdf3aab 100644 --- a/Assets/Script/InGame/Projectile/Projectile.cs +++ b/Assets/Script/InGame/Projectile/Projectile.cs @@ -1,4 +1,6 @@ using CodeStage.AntiCheat.ObscuredTypes; +using System.Collections.Generic; +using UnityEditor.Overlays; using UnityEngine; public class Projectile : MonoBehaviour @@ -8,7 +10,7 @@ public class Projectile : MonoBehaviour Vector2 dir; Vector2 prevPos; - ObscuredInt m_bounceCount; + ObscuredInt m_bounceCount, m_piereceCount; ProjectileData m_ProjectileData; @@ -34,35 +36,52 @@ public class Projectile : MonoBehaviour public void Set(ProjectileData pd) { m_ProjectileData = pd; - Transform startTf = m_ProjectileData.tf_Start; - if (m_ProjectileData.PreviousArrow > 0) + Vector3 pos = pd.tf_Start.position; + Quaternion rot = pd.tf_Start.rotation; + + /* ============================= + * 직선 화살 위치 분산 + * ============================= */ + if (pd.PreviousArrow > 0) { - int total = m_ProjectileData.PreviousArrow + 1; - int index = m_ProjectileData.ArrowIndex; - - // 투사체 간격 (데이터 or Sprite 기준) + int count = pd.PreviousArrow + 1; float spacing = 0.5f; + float offset = (pd.LineIndex - (count - 1) * 0.5f) * spacing; - // 중앙 기준 오프셋 - float startOffset = -(total - 1) * 0.5f * spacing; - float offset = startOffset + index * spacing; - - Vector3 right = startTf.right; - Vector3 pos = startTf.position + right * offset; - - transform.SetPositionAndRotation(pos, startTf.rotation); + pos += pd.tf_Start.right * offset; } - else - transform.SetPositionAndRotation(startTf.position, startTf.rotation); - if (!m_ProjectileData.IsPC) - transform.eulerAngles = new Vector3(0f, 0f, 180f); + transform.SetPositionAndRotation(pos, rot); + + /* ============================= + * 사선 화살 각도 분산 + * ============================= */ + float angle = 0f; + + if (pd.DiagonalArrow > 0 && pd.DiagIndex > 0) + { + int n = pd.DiagonalArrow; + float step = 90f / (n + 1); + + int order = pd.DiagIndex; + float offset = step * order; + + bool right = (order % 2) == 1; + angle = right ? offset : -offset; + } + + transform.rotation = Quaternion.AngleAxis(angle, transform.forward) * transform.rotation; + + if (!pd.IsPC) + transform.eulerAngles += new Vector3(0f, 0f, 180f); dir = transform.up.normalized; m_bounceCount = m_ProjectileData.m_Data.n_AttackBounceLimit; - if (pd.IsPC) m_bounceCount += (int)IngameMgr.Ins.Get_SkillValue(eSkillType.Reflect); + if (pd.IsPC) + m_bounceCount += (int)IngameMgr.Ins.Get_SkillValue(eSkillType.Reflect); + m_bounceCount.RandomizeCryptoKey(); } @@ -80,6 +99,13 @@ public class Projectile : MonoBehaviour Check_Hit(collision); + if (m_piereceCount > 0) + { + --m_piereceCount; + m_piereceCount.RandomizeCryptoKey(); + return; + } + if (m_bounceCount <= 0) { Kill(); @@ -150,7 +176,12 @@ public class Projectile : MonoBehaviour { switch(collision.tag) { - case "Mob": collision.GetComponent().Get_Dmg(m_ProjectileData); break; + case "Mob": + collision.GetComponent().Get_Dmg(m_ProjectileData); + Spawn_LeftRight(collision.transform); + Spawn_UpDown(collision.transform); + Spawn_Bounce(collision.GetComponent()); + break; case "MobShield": collision.GetComponent().Get_Dmg(); break; } } @@ -162,15 +193,125 @@ public class Projectile : MonoBehaviour } } } + + public void SetDirection(Vector2 direction) + { + dir = direction.normalized; + + // 방향에 맞게 회전도 맞춰줌 + float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f; + transform.rotation = Quaternion.Euler(0, 0, angle); + } + + List GetOffsets(int count, float spacing) + { + List offsets = new List(); + + float start = -(count - 1) * 0.5f; + + for (int i = 0; i < count; i++) + offsets.Add((start + i) * spacing); + + return offsets; + } + + void SpawnProjectile( + Vector3 pos, + Vector2 dir, + ProjectileData baseData +) + { + Projectile p = ProjectileMgr.Ins.Get(baseData.m_Data.s_ProjectilePrefabs); + + p.Set(baseData); + p.transform.position = pos; + p.SetDirection(dir); + } + + void SpawnExtra(Vector3 pos, Vector3 dir) + { + var p = ProjectileMgr.Ins.Get(m_ProjectileData.m_Data.s_ProjectilePrefabs); + p.Set(new ProjectileData + { + IsPC = m_ProjectileData.IsPC, + m_Data = m_ProjectileData.m_Data, + tf_Start = transform, + Dmg = m_ProjectileData.Dmg, + + ArrowLeftRight = 0, + ArrowUpDown = 0, + Bounce = 0 + }); + + p.transform.position = pos; + p.SetDirection(dir); + } + + void Spawn_LeftRight(Transform tf) + { + if (m_ProjectileData.ArrowLeftRight <= 0) return; + + Vector3 hitPos = tf.position; + float spacing = 1.5f; + int count = m_ProjectileData.ArrowLeftRight; + var offsets = GetOffsets(count, spacing); + + foreach (float offset in offsets) + { + // ▶ 오른쪽 + SpawnProjectile(hitPos + Vector3.up * (offset + 0.5f), Vector2.right, m_ProjectileData); + // ◀ 왼쪽 + SpawnProjectile(hitPos + Vector3.up * (offset + 0.5f), Vector2.left, m_ProjectileData); + } + } + void Spawn_UpDown(Transform tf) + { + if (m_ProjectileData.ArrowUpDown <= 0) return; + + Vector3 hitPos = tf.position; + float spacing = 1.5f; + int count = m_ProjectileData.ArrowLeftRight; + var offsets = GetOffsets(count, spacing); + + foreach (float offset in offsets) + { + // ▲ 위 + SpawnProjectile(hitPos + Vector3.right * offset, Vector2.up, m_ProjectileData); + + // ▼ 아래 + SpawnProjectile(hitPos + Vector3.right * offset, Vector2.down, m_ProjectileData); + } + } + void Spawn_Bounce(MobActor mob) + { + if (m_ProjectileData.Bounce <= 0 || mob == null) return; + + MobActor target = IngameMgr.Ins.FindNearestMob(mob.transform.position, mob); + if (target == null) return; + + Vector3 dir = (target.transform.position - mob.transform.position).normalized; + + SpawnExtra(mob.transform.position, dir); + --m_ProjectileData.Bounce; + } } public class ProjectileData { public ProjectileTableData m_Data; public Transform tf_Start; - public int PreviousArrow; // 0 이면 아님 - public int ArrowIndex; ObscuredBool _IsPC; public bool IsPC { get { return _IsPC; } set { _IsPC = value; _IsPC.RandomizeCryptoKey(); } } ObscuredInt _Lv; public int Lv { get { return _Lv; } set { _Lv = value; _Lv.RandomizeCryptoKey(); } } ObscuredInt _Dmg; public int Dmg { get { return _Dmg; } set { _Dmg = value; _Dmg.RandomizeCryptoKey(); } } + + // 발사 계열 + public int PreviousArrow; + public int DiagonalArrow; + public int LineIndex; + public int DiagIndex; + + // 피격 계열 + public int ArrowLeftRight; + public int ArrowUpDown; + public int Bounce; } \ No newline at end of file diff --git a/Assets/Script/UGUI/Common/GameUI.cs b/Assets/Script/UGUI/Common/GameUI.cs index 2e3b8e4..d75ba63 100644 --- a/Assets/Script/UGUI/Common/GameUI.cs +++ b/Assets/Script/UGUI/Common/GameUI.cs @@ -28,6 +28,7 @@ public class GameUI : MonoBehaviourSingletonTemplate public void Set_UI(int index) { DSUtil.InActivateGameObjects(gos, index); + if (index == 2) Time.timeScale = 1f; } public void Set_OverUI(int index, bool active)