using UnityEngine; using Colosseum.Player; namespace Colosseum.Skills.Effects { /// /// 넉백 효과 /// [CreateAssetMenu(fileName = "KnockbackEffect", menuName = "Colosseum/Skills/Effects/Knockback")] public class KnockbackEffect : SkillEffect { [Header("Knockback Settings")] [Min(0f)] [SerializeField] private float force = 5f; [SerializeField] private float upwardForce = 2f; [Min(0.05f)] [SerializeField] private float duration = 0.2f; [Header("Hit Animation")] [Tooltip("넉백 적용 시 경직 애니메이션 재생 여부")] [SerializeField] private bool playHitAnimation = true; [Tooltip("경직 애니메이션 재생 속도 배율")] [Min(0.01f)] [SerializeField] private float hitAnimationSpeedMultiplier = 1f; protected override void ApplyEffect(GameObject caster, GameObject target) { if (target == null || caster == null) return; Vector3 direction = target.transform.position - caster.transform.position; direction.y = 0f; if (direction.sqrMagnitude <= 0.0001f) direction = caster.transform.forward; else direction.Normalize(); Vector3 knockbackVelocity = direction * force + Vector3.up * upwardForce; HitReactionController hitReactionController = target.GetComponent(); if (hitReactionController == null) hitReactionController = target.GetComponentInParent(); if (hitReactionController != null) { hitReactionController.ApplyKnockback(knockbackVelocity, duration, playHitAnimation, hitAnimationSpeedMultiplier); return; } PlayerMovement playerMovement = target.GetComponent(); if (playerMovement == null) playerMovement = target.GetComponentInParent(); if (playerMovement != null) { playerMovement.ApplyForcedMovement(knockbackVelocity, duration); } } } }