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; [Tooltip("시야 장애물 차폐를 무시하고 무조건 감지하는 초근접 반경 (유닛)"), Min(0f)] public float ProximityAlertRange = 2.0f; [Tooltip("적의 기본 시야 사거리 (유닛)"), Min(0f)] public float DefaultSightRange = 8.0f; [Tooltip("일반 적이 시야를 잃은 뒤 마지막 위치를 기억하는 시간 (초)"), Min(0f)] public float LostSightMemoryDuration = 1.5f; [Tooltip("비탐지 일반 적의 로밍 반경 최솟값 (유닛)"), Min(0f)] public float RoamRadiusMin = 2.5f; [Tooltip("비탐지 일반 적의 로밍 반경 최댓값 (유닛)"), Min(0f)] public float RoamRadiusMax = 4.0f; [Tooltip("로밍 지점 도착 후 최소 대기시간 (초)"), Min(0f)] public float RoamPauseMin = 0.4f; [Tooltip("로밍 지점 도착 후 최대 대기시간 (초)"), Min(0f)] public float RoamPauseMax = 1.0f; [Tooltip("EncounterGroup 내부 적의 최소 초기 간격 (유닛)"), Min(0f)] public float EncounterGroupMinSpacing = 1.5f; [Tooltip("EncounterGroup 내부 적의 최대 초기 간격 (유닛)"), Min(0f)] public float EncounterGroupMaxSpacing = 2.5f; [Tooltip("장애물 회피(Wall Slide) 원형 캐스트 반경"), Min(0.05f)] public float WallSlideCastRadius = 0.35f; [Tooltip("장애물 회피(Wall Slide) 원형 캐스트 거리"), Min(0.05f)] public float WallSlideCastDistance = 0.4f; [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(); } }