PreviousArrow

This commit is contained in:
Ino 2026-01-15 06:45:26 +09:00
parent 132051f2f7
commit 5875e79ff3
6 changed files with 58 additions and 14 deletions

View File

@ -15,6 +15,7 @@ ArrowLeftRight 투사체에 적이 명중할 경우 좌/우 방향으로 투
ImpactArrow 투사체가 적의 방어막에 막혀도 +1의 피해를 고정으로 입힙니다. ImpactArrow 투사체가 적의 방어막에 막혀도 +1의 피해를 고정으로 입힙니다.
//AttackSpeedUp 공격 속도가 0.1초 감소합니다. //AttackSpeedUp 공격 속도가 0.1초 감소합니다.
반사와 관통이 동시에 있을 경우, 관통 후 반사
몬스터 이동방식 구현 몬스터 이동방식 구현
// - 직진 // - 직진

View File

@ -1 +1 @@
[{"n_UnitID":"1001","n_DefaultAttack":"25","n_DefaultHp":"500","f_AttackSpeed":"1.25","n_DefaultProjectileCount":"1","n_ProjectileID":"3001","s_UnitPrefabPath":"DefaultUnit"}] [{"n_UnitID":"1001","n_DefaultAttack":"25","n_DefaultHp":"2000","f_AttackSpeed":"1.25","n_DefaultProjectileCount":"1","n_ProjectileID":"3001","s_UnitPrefabPath":"DefaultUnit"}]

View File

@ -1 +1 @@
[{"n_PatternID":"1001","n_AppearWave":"1","n_AppearMeleeMonster":"2","n_AppearRangeMonster":"2","f_AppearDelay":"0.5","n_OverlapUnitCount":"1","f_NextWaveDelay":"3.5"},{"n_PatternID":"1001","n_AppearWave":"2","n_AppearMeleeMonster":"2","n_AppearRangeMonster":"2","f_AppearDelay":"0.35","n_OverlapUnitCount":"1","f_NextWaveDelay":"2.5"},{"n_PatternID":"1001","n_AppearWave":"3","n_AppearMeleeMonster":"2","n_AppearRangeMonster":"2","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"}] [{"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"}]

View File

@ -46,6 +46,14 @@ public class AimArrowController : MonoBehaviour
} }
void Shoot() 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 unit = IngameMgr.Ins.Get_CurUnitTData();
var attack = unit.n_DefaultAttack + IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp); var attack = unit.n_DefaultAttack + IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp);
@ -54,10 +62,34 @@ public class AimArrowController : MonoBehaviour
IsPC = true, IsPC = true,
m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID), m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID),
tf_Start = arrow.transform, tf_Start = arrow.transform,
PreviousArrow = 0,
Dmg = (int)attack Dmg = (int)attack
}); });
} }
void Shoot_PreviousArrow()
{
var unit = IngameMgr.Ins.Get_CurUnitTData();
var attack = unit.n_DefaultAttack + IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp);
int prev = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.PreviousArrow);
int total = prev + 1;
for (int i = 0; i < total; i++)
{
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
{
IsPC = true,
PreviousArrow = prev,
ArrowIndex = i,
m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID),
tf_Start = arrow.transform,
Dmg = (int)attack
});
}
}
void UpdateArrow(Vector2 currentPos) void UpdateArrow(Vector2 currentPos)
{ {
Vector2 dir = currentPos - (Vector2)arrow.transform.position; Vector2 dir = currentPos - (Vector2)arrow.transform.position;

View File

@ -34,8 +34,28 @@ public class Projectile : MonoBehaviour
public void Set(ProjectileData pd) public void Set(ProjectileData pd)
{ {
m_ProjectileData = pd; m_ProjectileData = pd;
Transform startTf = m_ProjectileData.tf_Start;
if (m_ProjectileData.PreviousArrow > 0)
{
int total = m_ProjectileData.PreviousArrow + 1;
int index = m_ProjectileData.ArrowIndex;
// 투사체 간격 (데이터 or Sprite 기준)
float spacing = 0.5f;
// 중앙 기준 오프셋
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);
}
else
transform.SetPositionAndRotation(startTf.position, startTf.rotation);
transform.SetPositionAndRotation(m_ProjectileData.tf_Start.position, m_ProjectileData.tf_Start.rotation);
if (!m_ProjectileData.IsPC) if (!m_ProjectileData.IsPC)
transform.eulerAngles = new Vector3(0f, 0f, 180f); transform.eulerAngles = new Vector3(0f, 0f, 180f);
@ -142,23 +162,14 @@ public class Projectile : MonoBehaviour
} }
} }
} }
void Projectile_Split(bool hitEnemy)
{
if (hitEnemy)
{
for (int i = 0; i < 2; i++)
{
//ProjectileMgr.Ins.Get(transform.position, Quaternion.Euler(0, 0, Random.Range(-20, 20)) * dir);
}
}
}
} }
public class ProjectileData public class ProjectileData
{ {
public ProjectileTableData m_Data; public ProjectileTableData m_Data;
public Transform tf_Start; public Transform tf_Start;
public int PreviousArrow; // 0 이면 아님
public int ArrowIndex;
ObscuredBool _IsPC; public bool IsPC { get { return _IsPC; } set { _IsPC = value; _IsPC.RandomizeCryptoKey(); } } 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 _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(); } } ObscuredInt _Dmg; public int Dmg { get { return _Dmg; } set { _Dmg = value; _Dmg.RandomizeCryptoKey(); } }