using CodeStage.AntiCheat.ObscuredTypes; using System.Collections; using UnityEngine; public enum eMobState { Move, Attack } public class MobActor : MonoBehaviour { public MobShields m_MobShields; MonsterTableData m_Data; float FenceY, m_attackTimer; eMobState m_State = eMobState.Move; Animator m_Animator; HUD_HP m_HUD_HP; private void OnValidate() { m_MobShields = GetComponentInChildren(); } 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(); } } private void Awake() { var srs = GetComponentsInChildren(true); for (int i = 0; i < srs.Length; i++) srs[i].sortingOrder -= 5; m_Animator = GetComponentInChildren(); } private void Update() { float distToFence = transform.position.y - FenceY; switch (m_State) { case eMobState.Move: if (distToFence <= m_Data.f_AttackRange) OnEnterAttack(); else Move(); break; case eMobState.Attack: Attack(); break; } } public void Set(bool isboss, MonsterTableData data, float fenceY) { gameObject.SetActive(true); if (m_HUD_HP == null) m_HUD_HP = DSUtil.Get_Clone("HUD/HUD_HP", IngameMgr.Ins.tf_hudparent); m_State = eMobState.Move; m_Data = data; FenceY = fenceY; m_attackTimer = m_Data.f_AttackDelay; var curstagedata = IngameMgr.Ins.Get_CurStageTData(); m_Attack = m_Data.n_DefaultAttack + (isboss ? curstagedata.n_DefaultBossAttack : curstagedata.n_DefaultEnemyAttack); m_HP = m_Data.n_DefaultHp + (isboss ? curstagedata.n_DefaultBossHp : curstagedata.n_DefaultEnemyHp); (m_HUD_HP.transform as RectTransform).anchoredPosition = Vector2.one * 10000f; m_HUD_HP.Set(transform, m_HP); m_MobShields.Set(data); } void Move() { transform.position += Vector3.down * Time.deltaTime * m_Data.f_MoveSpeed; } void OnEnterAttack() { m_State = eMobState.Attack; // 이동 정지 시점 보정 (너무 파고들지 않게) 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"); StartCoroutine(Co_AttackProjectile()); } IEnumerator Co_AttackProjectile() { yield return new WaitForSeconds(1f); ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData { IsPC = false, m_Data = table_projectile.Ins.Get_Data(m_Data.n_ProjectileID), tf_Start = transform, Dmg = m_Attack }); } public void Get_Dmg(int dmg) { m_HP -= dmg; m_HUD_HP.Set(m_HP); if (m_HP <= 0) { IngameMgr.Ins.Add_MobKill(m_Data.n_DropExp); gameObject.SetActive(false); } } public void Off() { gameObject.SetActive(false); m_HUD_HP.gameObject.SetActive(false); } }