using BumpCombat.Enemies; using UnityEngine; namespace BumpCombat.Constants { [CreateAssetMenu(menuName = "BumpCombat/Constants/Enemies")] public sealed class EnemyConstants : ScriptableObject { [Header("행동 판정")] [Tooltip("원뿔 공격 판정의 방향 내적 기준"), Range(0f, 1f)] public float ConeDirectionThreshold = 0.5f; [Tooltip("원형 범위 공격의 최소 경고시간 (초)"), Min(0f)] public float MinimumTargetCircleWarningDuration = 1.8f; [Tooltip("적 분리 방향을 다시 계산하는 간격 (초)"), Min(0f)] public float SeparationRefreshInterval = 0.1f; [Min(0f)] public float DefaultSeparationRadius = 0.55f; [Min(0f)] public float DefaultSeparationStrength = 0.6f; [Tooltip("Animator에 사망 클립이 없을 때의 대체 사망시간 (초)"), Min(0f)] public float DefaultDeathDuration = 0.5f; [Tooltip("사망 클립 종료 뒤 오브젝트를 정리하기 전 여유시간 (초)"), Min(0f)] public float DeathRemovalPadding = 0.05f; [Tooltip("몸 공격 상태에서 적이 전진하는 속도 (유닛/초)"), Min(0f)] public float BodyContactSpeed = 3f; [Tooltip("적 넉백 속도가 줄어드는 비율 (유닛/초)"), Min(0f)] public float KnockbackDeceleration = 8f; [Tooltip("군중형이 플레이어를 둘러싸며 접근하는 기준점 개수"), Min(1)] public int CrowdApproachSlotCount = 24; [Tooltip("군중형이 접근 기준점에 배치되는 동심원 개수"), Min(1)] public int CrowdApproachRingCount = 3; [Tooltip("군중형 접근 기준점의 가장 안쪽 반경 (유닛)"), Min(0f)] public float CrowdApproachBaseRadius = 0.75f; [Tooltip("군중형 접근 기준점 동심원 간 간격 (유닛)"), Min(0f)] public float CrowdApproachRingSpacing = 0.15f; [Min(0f)] public float SummonedEnemyNoAnimationLockDuration = 0.15f; [Header("적과 플레이어 사이 거리")] [Tooltip("일반 적이 주는 플레이어 넉백 거리 (유닛)"), Min(0f)] public float NormalPlayerKnockbackDistance = 0.75f; [Tooltip("대형 무기 적이 주는 플레이어 넉백 거리 (유닛)"), Min(0f)] public float HeavyPlayerKnockbackDistance = 1.1f; [Tooltip("원거리 적 공격 허용 범위 안쪽 여백 (유닛)"), Min(0f)] public float RangedAttackArenaInset = 0.75f; [Tooltip("화면 안쪽에서 원거리 공격을 시작하기 위한 여백 (유닛)"), Min(0f)] public float RangedAttackCameraInset = 0.5f; [Tooltip("원거리 적 접근 목표의 전장 가장자리 여백 (유닛)"), Min(0f)] public float RangedApproachArenaInset = 0.8f; [Tooltip("원거리 적 접근 목표의 화면 여백 (유닛)"), Min(0f)] public float RangedApproachCameraInset = 0.55f; [Header("엘리트 이상 그로기")] [Min(0f)] public float EliteGroggyDuration = 5f; [Min(0f)] public float MidBossGroggyDuration = 7f; [Min(0f)] public float FinalBossGroggyDuration = 10f; [Tooltip("엘리트 실드를 깰 때 필요한 일치색 적중 횟수"), Min(1)] public int EliteGroggyRequiredMatchingHits = 1; [Tooltip("중간보스 실드를 깰 때 필요한 일치색 적중 횟수"), Min(1)] public int MidBossGroggyRequiredMatchingHits = 2; [Tooltip("최종보스 실드를 깰 때 필요한 일치색 적중 횟수"), Min(1)] public int FinalBossGroggyRequiredMatchingHits = 4; [Header("네크로맨서")] [Min(0.5f)] public float GeneralSummonCooldown = 8f; [Min(0.5f)] public float CrowdSummonCooldown = 12f; [Min(0.5f)] public float MultiAoeCooldown = 4f; [Tooltip("소환 예고와 소환 중 행동 잠금시간 (초)"), Min(0.5f)] public float SummonVisualDuration = 0.875f; [Range(0.01f, 0.2f)] public float DesperationHealthFraction = 0.05f; [Header("공격 토큰")] [Min(1)] public int MaxMeleeAttackers = 4; [Min(1)] public int MaxRangedAttackers = 3; [Min(1)] public int MaxEarlyCrowdAttackers = 1; [Min(1)] public int MaxLateCrowdAttackers = 2; [Min(0f)] public float CrowdAttackExpansionTime = 180f; [Min(0f)] public float CrowdAttackGrantInterval = 0.9f; [Header("적 정의")] [Tooltip("각 적의 능력치·공격 패턴 정의. 적 프리팹은 여기에 있는 에셋을 참조합니다.")] public EnemyDefinition[] Definitions = System.Array.Empty(); } }