using System.Collections; using UnityEngine; public enum eMobState { Move, Attack } public class MobActor : MonoBehaviour { MonsterTableData m_Data; float FenceY, m_attackTimer; eMobState m_State = eMobState.Move; Animator m_Animator; 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(MonsterTableData data, float fenceY) { m_Data = data; FenceY = fenceY; m_attackTimer = m_Data.f_AttackDelay; } 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.Get(m_Data.n_ProjectileID, transform).Set(m_Data.n_ProjectileID); } }