DiagonalArrow, Bounce, ArrowUpDown, ArrowLeftRight

This commit is contained in:
Ino 2026-01-15 07:48:21 +09:00
parent 5875e79ff3
commit edb79eb4d5
10 changed files with 233 additions and 58 deletions

View File

@ -1,7 +1,7 @@
스킬 15종 스킬 15종
//HpUp 적에게 버틸 수 있는 성벽의 생명력이 증가합니다. //HpUp 적에게 버틸 수 있는 성벽의 생명력이 증가합니다.
//AttackUp 공격력이 +1 증가합니다. //AttackUp 공격력이 +1 증가합니다.
PreviousArrow 투사체 타격 횟수가 +1 증가합니다. //PreviousArrow 투사체 타격 횟수가 +1 증가합니다.
DiagonalArrow 발사 된 투사체 방향으로 사선 방향의 투사체 1개가 추가됩니다. DiagonalArrow 발사 된 투사체 방향으로 사선 방향의 투사체 1개가 추가됩니다.
ProjectilePierce 투사체가 적을 관통하는 횟수가 증가합니다. ProjectilePierce 투사체가 적을 관통하는 횟수가 증가합니다.
//Reflect 투사체 반사 횟수가 +1 증가합니다. //Reflect 투사체 반사 횟수가 +1 증가합니다.

View File

@ -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"}]

View File

@ -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"}]

View File

@ -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"}]

View File

@ -46,49 +46,50 @@ 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);
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData ProjectileData basePd = new ProjectileData
{ {
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 = unit.n_DefaultAttack + (int)IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp),
Dmg = (int)attack
});
}
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(); for (int d = 0; d < diagCnt; d++)
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 ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
{ {
IsPC = true, LineIndex = l,
PreviousArrow = prev, DiagIndex = d,
ArrowIndex = i, PreviousArrow = basePd.PreviousArrow,
m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID), DiagonalArrow = basePd.DiagonalArrow,
tf_Start = arrow.transform,
Dmg = (int)attack 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) void UpdateArrow(Vector2 currentPos)
{ {

View File

@ -145,6 +145,8 @@ public class MobActor : MonoBehaviour
m_HUD_HP.Set(m_HP); m_HUD_HP.Set(m_HP);
if (m_HP <= 0) if (m_HP <= 0)
{ {
if (m_State == eMobState.Die) return;
m_State = eMobState.Die; m_State = eMobState.Die;
IngameMgr.Ins.Add_MobKill(m_Data.n_DropExp); IngameMgr.Ins.Add_MobKill(m_Data.n_DropExp);
gameObject.SetActive(false); gameObject.SetActive(false);

View File

@ -168,7 +168,6 @@ public class IngameMgr : MonoBehaviourSingletonTemplate<IngameMgr>
Set_Texts(); Set_Texts();
StartCoroutine(Co_MakeMob()); StartCoroutine(Co_MakeMob());
} }
void MakeMob(bool isboss, MonsterTableData data) void MakeMob(bool isboss, MonsterTableData data)
{ {
string key = data.s_MonsterPrefabPath; string key = data.s_MonsterPrefabPath;
@ -198,6 +197,37 @@ public class IngameMgr : MonoBehaviourSingletonTemplate<IngameMgr>
mob.transform.localScale = Vector3.one * data.f_Scale; mob.transform.localScale = Vector3.one * data.f_Scale;
mob.Set(isboss,data, tf_fence.position.y); 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) public void Get_Dmg(int dmg)
{ {

View File

@ -1,4 +1,6 @@
using CodeStage.AntiCheat.ObscuredTypes; using CodeStage.AntiCheat.ObscuredTypes;
using System.Collections.Generic;
using UnityEditor.Overlays;
using UnityEngine; using UnityEngine;
public class Projectile : MonoBehaviour public class Projectile : MonoBehaviour
@ -8,7 +10,7 @@ public class Projectile : MonoBehaviour
Vector2 dir; Vector2 dir;
Vector2 prevPos; Vector2 prevPos;
ObscuredInt m_bounceCount; ObscuredInt m_bounceCount, m_piereceCount;
ProjectileData m_ProjectileData; ProjectileData m_ProjectileData;
@ -34,35 +36,52 @@ 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) Vector3 pos = pd.tf_Start.position;
Quaternion rot = pd.tf_Start.rotation;
/* =============================
*
* ============================= */
if (pd.PreviousArrow > 0)
{ {
int total = m_ProjectileData.PreviousArrow + 1; int count = pd.PreviousArrow + 1;
int index = m_ProjectileData.ArrowIndex;
// 투사체 간격 (데이터 or Sprite 기준)
float spacing = 0.5f; float spacing = 0.5f;
float offset = (pd.LineIndex - (count - 1) * 0.5f) * spacing;
// 중앙 기준 오프셋 pos += pd.tf_Start.right * offset;
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);
if (!m_ProjectileData.IsPC) transform.SetPositionAndRotation(pos, rot);
transform.eulerAngles = new Vector3(0f, 0f, 180f);
/* =============================
*
* ============================= */
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; dir = transform.up.normalized;
m_bounceCount = m_ProjectileData.m_Data.n_AttackBounceLimit; 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(); m_bounceCount.RandomizeCryptoKey();
} }
@ -80,6 +99,13 @@ public class Projectile : MonoBehaviour
Check_Hit(collision); Check_Hit(collision);
if (m_piereceCount > 0)
{
--m_piereceCount;
m_piereceCount.RandomizeCryptoKey();
return;
}
if (m_bounceCount <= 0) if (m_bounceCount <= 0)
{ {
Kill(); Kill();
@ -150,7 +176,12 @@ public class Projectile : MonoBehaviour
{ {
switch(collision.tag) 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; 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 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(); } }
// 발사 계열
public int PreviousArrow;
public int DiagonalArrow;
public int LineIndex;
public int DiagIndex;
// 피격 계열
public int ArrowLeftRight;
public int ArrowUpDown;
public int Bounce;
} }

View File

@ -28,6 +28,7 @@ public class GameUI : MonoBehaviourSingletonTemplate<GameUI>
public void Set_UI(int index) public void Set_UI(int index)
{ {
DSUtil.InActivateGameObjects(gos, index); DSUtil.InActivateGameObjects(gos, index);
if (index == 2) Time.timeScale = 1f;
} }
public void Set_OverUI(int index, bool active) public void Set_OverUI(int index, bool active)