2026-01-13 07:33:06 +00:00
|
|
|
using CodeStage.AntiCheat.ObscuredTypes;
|
2026-01-13 00:46:52 +00:00
|
|
|
using System.Collections;
|
2026-01-12 22:13:54 +00:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
2026-01-14 06:54:23 +00:00
|
|
|
public enum eMobState { Move, Attack, KnockBack, Die }
|
2026-01-12 22:47:31 +00:00
|
|
|
|
2026-01-12 22:13:54 +00:00
|
|
|
public class MobActor : MonoBehaviour
|
|
|
|
|
{
|
2026-01-13 22:18:11 +00:00
|
|
|
public MobShields m_MobShields;
|
2026-01-15 02:45:53 +00:00
|
|
|
public GameObject go_stun;
|
2026-01-13 22:18:11 +00:00
|
|
|
|
2026-01-14 06:54:23 +00:00
|
|
|
bool bBoss;
|
2026-01-12 22:47:31 +00:00
|
|
|
MonsterTableData m_Data;
|
|
|
|
|
float FenceY, m_attackTimer;
|
|
|
|
|
eMobState m_State = eMobState.Move;
|
2026-01-12 23:08:10 +00:00
|
|
|
Animator m_Animator;
|
2026-01-13 21:40:48 +00:00
|
|
|
HUD_HP m_HUD_HP;
|
2026-01-14 06:54:23 +00:00
|
|
|
Vector3 v3_knockBack;
|
2026-01-15 02:45:53 +00:00
|
|
|
float t_knockback, f_stunTime;
|
2026-01-13 20:40:28 +00:00
|
|
|
|
2026-01-13 22:18:11 +00:00
|
|
|
private void OnValidate()
|
|
|
|
|
{
|
|
|
|
|
m_MobShields = GetComponentInChildren<MobShields>();
|
2026-01-15 02:45:53 +00:00
|
|
|
go_stun = transform.Find("Stun_loop").gameObject;
|
2026-01-13 22:18:11 +00:00
|
|
|
}
|
|
|
|
|
|
2026-01-13 20:40:28 +00:00
|
|
|
string poolKey;
|
|
|
|
|
IngameMgr owner;
|
|
|
|
|
public void SetOwner(IngameMgr mgr, string key)
|
|
|
|
|
{
|
|
|
|
|
owner = mgr;
|
|
|
|
|
poolKey = key;
|
|
|
|
|
}
|
|
|
|
|
public void Die()
|
|
|
|
|
{
|
|
|
|
|
owner.ReturnMob(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string GetPoolKey()
|
|
|
|
|
{
|
|
|
|
|
return poolKey;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-13 23:57:21 +00:00
|
|
|
ObscuredInt _Attack; public int m_Attack { get { return _Attack; } set { _Attack = value; _Attack.RandomizeCryptoKey(); } }
|
|
|
|
|
ObscuredInt _HP; public int m_HP { get { return _HP; } set { _HP = value; _HP.RandomizeCryptoKey(); } }
|
2026-01-12 22:47:31 +00:00
|
|
|
|
2026-01-12 22:13:54 +00:00
|
|
|
private void Awake()
|
|
|
|
|
{
|
|
|
|
|
var srs = GetComponentsInChildren<SpriteRenderer>(true);
|
|
|
|
|
for (int i = 0; i < srs.Length; i++)
|
|
|
|
|
srs[i].sortingOrder -= 5;
|
2026-01-12 23:08:10 +00:00
|
|
|
m_Animator = GetComponentInChildren<Animator>();
|
2026-01-12 22:13:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Update()
|
|
|
|
|
{
|
2026-01-12 22:47:31 +00:00
|
|
|
float distToFence = transform.position.y - FenceY;
|
|
|
|
|
|
|
|
|
|
switch (m_State)
|
|
|
|
|
{
|
|
|
|
|
case eMobState.Move:
|
2026-01-15 02:45:53 +00:00
|
|
|
if (f_stunTime > 0) return;
|
|
|
|
|
|
2026-01-12 22:47:31 +00:00
|
|
|
if (distToFence <= m_Data.f_AttackRange)
|
|
|
|
|
OnEnterAttack();
|
|
|
|
|
else
|
|
|
|
|
Move();
|
|
|
|
|
break;
|
|
|
|
|
|
2026-01-14 06:54:23 +00:00
|
|
|
case eMobState.KnockBack:
|
|
|
|
|
t_knockback += Time.deltaTime;
|
|
|
|
|
transform.position = Vector3.Lerp(transform.position, v3_knockBack, t_knockback);
|
|
|
|
|
if (t_knockback >= 1f)
|
|
|
|
|
m_State = eMobState.Move;
|
|
|
|
|
break;
|
|
|
|
|
|
2026-01-12 22:47:31 +00:00
|
|
|
case eMobState.Attack:
|
2026-01-15 02:45:53 +00:00
|
|
|
if (f_stunTime > 0) return;
|
|
|
|
|
|
2026-01-15 22:40:46 +00:00
|
|
|
if (distToFence <= m_Data.f_AttackRange)
|
|
|
|
|
Attack();
|
|
|
|
|
else
|
|
|
|
|
m_State = eMobState.Move;
|
2026-01-12 22:47:31 +00:00
|
|
|
break;
|
|
|
|
|
}
|
2026-01-15 02:45:53 +00:00
|
|
|
|
|
|
|
|
if (f_stunTime > 0)
|
|
|
|
|
{
|
|
|
|
|
if (!go_stun.activeInHierarchy) go_stun.SetActive(true);
|
|
|
|
|
f_stunTime -= Time.deltaTime;
|
|
|
|
|
if (f_stunTime <= 0)
|
|
|
|
|
{
|
|
|
|
|
go_stun.SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-12 22:47:31 +00:00
|
|
|
}
|
|
|
|
|
|
2026-01-13 23:57:21 +00:00
|
|
|
public void Set(bool isboss, MonsterTableData data, float fenceY)
|
2026-01-12 22:47:31 +00:00
|
|
|
{
|
2026-01-13 20:40:28 +00:00
|
|
|
gameObject.SetActive(true);
|
2026-01-15 02:45:53 +00:00
|
|
|
go_stun.SetActive(false);
|
2026-01-13 21:40:48 +00:00
|
|
|
if (m_HUD_HP == null)
|
2026-01-14 04:49:44 +00:00
|
|
|
m_HUD_HP = DSUtil.Get_Clone<HUD_HP>("HUD/HUD_HP", IngameMgr.Ins.tf_hudparent);
|
2026-01-13 20:40:28 +00:00
|
|
|
|
|
|
|
|
m_State = eMobState.Move;
|
2026-01-12 22:47:31 +00:00
|
|
|
m_Data = data;
|
|
|
|
|
FenceY = fenceY;
|
|
|
|
|
m_attackTimer = m_Data.f_AttackDelay;
|
2026-01-16 07:11:49 +00:00
|
|
|
f_stunTime = 0f;
|
2026-01-13 23:57:21 +00:00
|
|
|
|
2026-01-14 06:54:23 +00:00
|
|
|
bBoss = isboss;
|
2026-01-13 23:57:21 +00:00
|
|
|
var curstagedata = IngameMgr.Ins.Get_CurStageTData();
|
2026-01-14 06:54:23 +00:00
|
|
|
m_Attack = m_Data.n_DefaultAttack + (bBoss ? curstagedata.n_DefaultBossAttack : curstagedata.n_DefaultEnemyAttack);
|
|
|
|
|
m_HP = m_Data.n_DefaultHp + (bBoss ? curstagedata.n_DefaultBossHp : curstagedata.n_DefaultEnemyHp);
|
2026-01-14 04:49:44 +00:00
|
|
|
(m_HUD_HP.transform as RectTransform).anchoredPosition = Vector2.one * 10000f;
|
2026-01-13 21:40:48 +00:00
|
|
|
m_HUD_HP.Set(transform, m_HP);
|
2026-01-16 03:49:39 +00:00
|
|
|
m_MobShields.Set(data, bBoss);
|
2026-01-12 22:47:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Move()
|
|
|
|
|
{
|
|
|
|
|
transform.position += Vector3.down * Time.deltaTime * m_Data.f_MoveSpeed;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-16 07:11:49 +00:00
|
|
|
public bool IsBossMob() { return bBoss; }
|
|
|
|
|
|
2026-01-12 22:47:31 +00:00
|
|
|
void OnEnterAttack()
|
|
|
|
|
{
|
2026-01-12 23:08:10 +00:00
|
|
|
m_State = eMobState.Attack;
|
|
|
|
|
|
2026-01-12 22:47:31 +00:00
|
|
|
// 이동 정지 시점 보정 (너무 파고들지 않게)
|
|
|
|
|
Vector3 pos = transform.position;
|
|
|
|
|
pos.y = FenceY + m_Data.f_AttackRange;
|
|
|
|
|
transform.position = pos;
|
|
|
|
|
|
|
|
|
|
// 애니메이션, 공격 쿨타임 초기화 등
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Attack()
|
|
|
|
|
{
|
|
|
|
|
m_attackTimer -= Time.deltaTime;
|
|
|
|
|
if (m_attackTimer > 0f)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_attackTimer = m_Data.f_AttackDelay;
|
|
|
|
|
|
2026-01-12 23:08:10 +00:00
|
|
|
//m_Animator.speed = 2f;
|
|
|
|
|
m_Animator.SetTrigger("att");
|
2026-01-13 00:46:52 +00:00
|
|
|
StartCoroutine(Co_AttackProjectile());
|
2026-01-12 22:47:31 +00:00
|
|
|
}
|
|
|
|
|
|
2026-01-13 00:46:52 +00:00
|
|
|
IEnumerator Co_AttackProjectile()
|
2026-01-12 22:47:31 +00:00
|
|
|
{
|
2026-01-13 00:46:52 +00:00
|
|
|
yield return new WaitForSeconds(1f);
|
2026-01-13 06:20:15 +00:00
|
|
|
|
|
|
|
|
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
|
|
|
|
|
{
|
2026-01-16 05:45:58 +00:00
|
|
|
ActorType = eActor.Mob,
|
2026-01-13 06:20:15 +00:00
|
|
|
m_Data = table_projectile.Ins.Get_Data(m_Data.n_ProjectileID),
|
2026-01-13 07:33:06 +00:00
|
|
|
tf_Start = transform,
|
2026-01-15 23:02:30 +00:00
|
|
|
Dmg = m_Attack,
|
2026-01-16 05:45:58 +00:00
|
|
|
Ignore_WallHP = false,
|
2026-01-13 06:20:15 +00:00
|
|
|
});
|
2026-01-12 22:13:54 +00:00
|
|
|
}
|
2026-01-13 07:33:06 +00:00
|
|
|
|
2026-01-14 06:54:23 +00:00
|
|
|
public void Get_Dmg(ProjectileData data)
|
2026-01-13 07:33:06 +00:00
|
|
|
{
|
2026-01-14 06:54:23 +00:00
|
|
|
m_HP -= data.Dmg;
|
2026-01-13 21:40:48 +00:00
|
|
|
m_HUD_HP.Set(m_HP);
|
2026-01-13 07:33:06 +00:00
|
|
|
if (m_HP <= 0)
|
|
|
|
|
{
|
2026-01-14 22:48:21 +00:00
|
|
|
if (m_State == eMobState.Die) return;
|
|
|
|
|
|
2026-01-14 06:54:23 +00:00
|
|
|
m_State = eMobState.Die;
|
2026-01-14 04:07:18 +00:00
|
|
|
IngameMgr.Ins.Add_MobKill(m_Data.n_DropExp);
|
2026-01-13 07:33:06 +00:00
|
|
|
gameObject.SetActive(false);
|
2026-01-15 06:34:35 +00:00
|
|
|
|
2026-01-16 05:45:58 +00:00
|
|
|
if (data.ActorType == eActor.PC)
|
2026-01-15 06:34:35 +00:00
|
|
|
{
|
2026-01-16 05:45:58 +00:00
|
|
|
var explosionlv = IngameMgr.Ins.Get_SkillLv(eSkillType.Explosion);
|
|
|
|
|
if (explosionlv > 0)
|
2026-01-15 06:34:35 +00:00
|
|
|
{
|
2026-01-16 05:45:58 +00:00
|
|
|
var tdata = table_skill.Ins.Get_Data(eSkillType.Explosion);
|
|
|
|
|
var unit = IngameMgr.Ins.Get_CurUnitTData();
|
|
|
|
|
var dmg = unit.n_DefaultAttack + (int)IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp);
|
|
|
|
|
var totaldmg = dmg = (int)(dmg * tdata.f_ExplosionDmg);
|
|
|
|
|
totaldmg += (int)(dmg * (tdata.f_ExplosionDmgPerLv * (explosionlv - 1)));
|
|
|
|
|
|
|
|
|
|
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
|
|
|
|
|
{
|
|
|
|
|
ActorType = data.ActorType,
|
|
|
|
|
Dmg = totaldmg,
|
|
|
|
|
m_Data = table_projectile.Ins.Get_Data(3002),
|
|
|
|
|
tf_Start = transform,
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-01-15 06:34:35 +00:00
|
|
|
}
|
2026-01-13 07:33:06 +00:00
|
|
|
}
|
2026-01-15 02:45:53 +00:00
|
|
|
else if (!bBoss)
|
2026-01-14 06:54:23 +00:00
|
|
|
{
|
2026-01-15 02:45:53 +00:00
|
|
|
if (data.m_Data != null)
|
|
|
|
|
{
|
2026-01-16 03:20:10 +00:00
|
|
|
var knockbackdist = data.m_Data.f_KnockbackDistance + IngameMgr.Ins.Get_SkillValue(eSkillType.Knockback);
|
|
|
|
|
|
|
|
|
|
if (knockbackdist > 0)
|
|
|
|
|
{
|
|
|
|
|
m_State = eMobState.KnockBack;
|
|
|
|
|
v3_knockBack = transform.position + new Vector3(0f, knockbackdist);
|
|
|
|
|
t_knockback = 0f;
|
|
|
|
|
}
|
2026-01-15 02:45:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
f_stunTime += IngameMgr.Ins.Get_SkillValue(eSkillType.Stun);
|
2026-01-14 06:54:23 +00:00
|
|
|
}
|
2026-01-13 07:33:06 +00:00
|
|
|
}
|
2026-01-13 21:40:48 +00:00
|
|
|
|
|
|
|
|
public void Off()
|
|
|
|
|
{
|
|
|
|
|
gameObject.SetActive(false);
|
|
|
|
|
m_HUD_HP.gameObject.SetActive(false);
|
|
|
|
|
}
|
2026-01-12 22:13:54 +00:00
|
|
|
}
|