OneShotOneKill/Assets/Script/InGame/Actor/MobActor.cs

219 lines
6.5 KiB
C#
Raw Normal View History

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
{
public MobShields m_MobShields;
2026-01-15 02:45:53 +00:00
public GameObject go_stun;
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;
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
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 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;
}
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;
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
}
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-14 06:54:23 +00:00
bBoss = isboss;
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);
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;
}
void OnEnterAttack()
{
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;
//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);
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
{
2026-01-16 05:45:58 +00:00
ActorType = eActor.Mob,
m_Data = table_projectile.Ins.Get_Data(m_Data.n_ProjectileID),
2026-01-13 07:33:06 +00:00
tf_Start = transform,
Dmg = m_Attack,
2026-01-16 05:45:58 +00:00
Ignore_WallHP = false,
});
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)
{
if (m_State == eMobState.Die) return;
2026-01-14 06:54:23 +00:00
m_State = eMobState.Die;
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
}