DiagonalArrow, Bounce, ArrowUpDown, ArrowLeftRight
This commit is contained in:
parent
5875e79ff3
commit
edb79eb4d5
|
|
@ -1,7 +1,7 @@
|
|||
스킬 15종
|
||||
//HpUp 적에게 버틸 수 있는 성벽의 생명력이 증가합니다.
|
||||
//AttackUp 공격력이 +1 증가합니다.
|
||||
PreviousArrow 투사체 타격 횟수가 +1 증가합니다.
|
||||
//PreviousArrow 투사체 타격 횟수가 +1 증가합니다.
|
||||
DiagonalArrow 발사 된 투사체 방향으로 사선 방향의 투사체 1개가 추가됩니다.
|
||||
ProjectilePierce 투사체가 적을 관통하는 횟수가 증가합니다.
|
||||
//Reflect 투사체 반사 횟수가 +1 증가합니다.
|
||||
|
|
|
|||
|
|
@ -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"}]
|
||||
[{"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"}]
|
||||
|
|
@ -1 +1 @@
|
|||
[{"n_UnitID":"1001","n_DefaultAttack":"25","n_DefaultHp":"2000","f_AttackSpeed":"1.25","n_DefaultProjectileCount":"1","n_ProjectileID":"3001","s_UnitPrefabPath":"DefaultUnit"}]
|
||||
[{"n_UnitID":"1001","n_DefaultAttack":"25","n_DefaultHp":"999999","f_AttackSpeed":"1.25","n_DefaultProjectileCount":"1","n_ProjectileID":"3001","s_UnitPrefabPath":"DefaultUnit"}]
|
||||
|
|
@ -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"}]
|
||||
[{"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"}]
|
||||
Binary file not shown.
|
|
@ -46,49 +46,50 @@ 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()
|
||||
PreviousArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.PreviousArrow),
|
||||
DiagonalArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.DiagonalArrow),
|
||||
|
||||
ArrowLeftRight = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ArrowLeftRight),
|
||||
ArrowUpDown = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ArrowUpDown),
|
||||
Bounce = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.Bounce)
|
||||
};
|
||||
|
||||
int lineCnt = 1 + basePd.PreviousArrow;
|
||||
int diagCnt = 1 + basePd.DiagonalArrow;
|
||||
|
||||
for (int l = 0; l < lineCnt; l++)
|
||||
{
|
||||
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++)
|
||||
for (int d = 0; d < diagCnt; d++)
|
||||
{
|
||||
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
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -168,7 +168,6 @@ public class IngameMgr : MonoBehaviourSingletonTemplate<IngameMgr>
|
|||
Set_Texts();
|
||||
StartCoroutine(Co_MakeMob());
|
||||
}
|
||||
|
||||
void MakeMob(bool isboss, MonsterTableData data)
|
||||
{
|
||||
string key = data.s_MonsterPrefabPath;
|
||||
|
|
@ -198,6 +197,37 @@ public class IngameMgr : MonoBehaviourSingletonTemplate<IngameMgr>
|
|||
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<MobActor> 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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<MobActor>().Get_Dmg(m_ProjectileData); break;
|
||||
case "Mob":
|
||||
collision.GetComponent<MobActor>().Get_Dmg(m_ProjectileData);
|
||||
Spawn_LeftRight(collision.transform);
|
||||
Spawn_UpDown(collision.transform);
|
||||
Spawn_Bounce(collision.GetComponent<MobActor>());
|
||||
break;
|
||||
case "MobShield": collision.GetComponent<MobShield>().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<float> GetOffsets(int count, float spacing)
|
||||
{
|
||||
List<float> offsets = new List<float>();
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
@ -28,6 +28,7 @@ public class GameUI : MonoBehaviourSingletonTemplate<GameUI>
|
|||
public void Set_UI(int index)
|
||||
{
|
||||
DSUtil.InActivateGameObjects(gos, index);
|
||||
if (index == 2) Time.timeScale = 1f;
|
||||
}
|
||||
|
||||
public void Set_OverUI(int index, bool active)
|
||||
|
|
|
|||
Loading…
Reference in New Issue