using UnityEngine; using Unity.Netcode; namespace Colosseum.Enemy { /// /// 적 캐릭터 애니메이션 컨트롤러 /// NavMeshAgent 속도에 따라 Idle/Move 애니메이션 제어 /// public class EnemyAnimationController : NetworkBehaviour { [Header("Animation Parameters")] [SerializeField] private string speedParam = "Speed"; [SerializeField] private string attackTriggerParam = "Attack"; [SerializeField] private string skillTriggerParam = "Skill"; [Header("Settings")] [SerializeField] private float speedSmoothTime = 0.1f; [SerializeField] private float stopThreshold = 0.05f; private Animator animator; private UnityEngine.AI.NavMeshAgent navMeshAgent; private EnemyBase enemyBase; private float currentSpeed; private float speedVelocity; private void Awake() { animator = GetComponent(); navMeshAgent = GetComponent(); enemyBase = GetComponent(); } public override void OnNetworkSpawn() { if (!IsServer) { enabled = false; } } private void Update() { if (!IsServer) return; UpdateAnimationParameters(); } /// /// 애니메이션 파라미터 업데이트 /// private void UpdateAnimationParameters() { // 사망 상태에서는 애니메이션 파라미터 업데이트 중단 if (enemyBase != null && enemyBase.IsDead) return; if (animator == null || navMeshAgent == null) return; // NavMeshAgent의 속도를 기반으로 타겟 속도 계산 float targetSpeed = navMeshAgent.velocity.magnitude; // 정지 임계값 처리 if (targetSpeed < stopThreshold) targetSpeed = 0f; // 부드러운 속도 변화 currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedVelocity, speedSmoothTime); // 애니메이터 파라미터 설정 animator.SetFloat(speedParam, currentSpeed); } /// /// 공격 애니메이션 트리거 (외부에서 호출) /// public void PlayAttack() { if (!IsServer || animator == null) return; // 사망 상태에서는 공격 애니메이션 재생하지 않음 if (enemyBase != null && enemyBase.IsDead) return; animator.SetTrigger(attackTriggerParam); } /// /// 스킬 애니메이션 트리거 (외부에서 호출) /// public void PlaySkill() { if (!IsServer || animator == null) return; // 사망 상태에서는 스킬 애니메이션 재생하지 않음 if (enemyBase != null && enemyBase.IsDead) return; animator.SetTrigger(skillTriggerParam); } /// /// 특정 애니메이션 트리거 재생 /// /// 트리거 파라미터 이름 public void PlayTrigger(string triggerName) { if (!IsServer || animator == null) return; // 사망 상태에서는 일반 애니메이션 재생하지 않음 if (enemyBase != null && enemyBase.IsDead) return; animator.SetTrigger(triggerName); } /// /// 현재 애니메이션 속도 /// public float CurrentSpeed => currentSpeed; } }