using UnityEngine; /// /// 보스 카운터 시스템의 임계치, 가중치, 감소(Decay) 설정을 담는 ScriptableObject. /// Inspector에서 밸런싱을 위해 쉽게 조정할 수 있습니다. /// /// [사용법] Project 창에서 우클릭 → Create → Boss/Counter Config /// [CreateAssetMenu(fileName = "BossCounterConfig", menuName = "Boss/Counter Config")] public class BossCounterConfig : ScriptableObject { [Header("══ 기본 임계치 (첫 런 / 잠금 해제 전) ══")] [Tooltip("회피 카운터 발동 조건: 10초 내 회피 횟수")] public int dodgeThreshold = 5; [Tooltip("조준 카운터 발동 조건: 10초 내 조준 유지 시간(초)")] public float aimThreshold = 4.0f; [Tooltip("관통 카운터 발동 조건: 10초 내 관통 비율")] [Range(0f, 1f)] public float pierceThreshold = 0.6f; [Tooltip("관통 비율 판단을 위한 최소 발사 횟수")] public int minShotsForPierceCheck = 3; [Header("══ 잠금 해제 후 임계치 감소 ══")] [Tooltip("잠금 해제된 카운터의 임계치 감소 비율 (0.8 = 20% 낮아짐)")] [Range(0.5f, 1.0f)] public float unlockedThresholdMultiplier = 0.8f; [Header("══ 가중치 설정 (확률 가중치 방식) ══")] [Tooltip("카운터 발동 시 해당 카운터 패턴에 추가되는 가중치")] public float counterWeightBonus = 3f; [Tooltip("카운터 발동 시 보조 패턴에 추가되는 가중치")] public float counterSubWeightBonus = 2f; [Header("══ Decay(감소) 설정 ══")] [Tooltip("카운터 모드 유지 시간(초). 이 시간 동안 조건 미충족 시 비활성화")] public float counterDecayTime = 8f; [Header("══ 빈도 제한 ══")] [Tooltip("카운터 패턴 선택 확률 상한 (0.25 = 최대 25%)")] [Range(0.1f, 0.5f)] public float maxCounterFrequency = 0.25f; [Tooltip("카운터 패턴 발동 후 쿨타임(초)")] public float counterCooldown = 5f; [Header("══ 습관 변경 보상 ══")] [Tooltip("플레이어가 이전 런에서 발동된 카운터 습관을 이번 런에서 안 보이면, 보스 일반 패턴 난이도 감소 비율")] [Range(0f, 0.3f)] public float habitChangeRewardRatio = 0.15f; // ═══════════════════════════════════════════ // 임계치 조회 (잠금 해제 여부 반영) // ═══════════════════════════════════════════ /// 현재 유효 임계치 반환 (잠금 해제 시 낮아짐) public int GetEffectiveDodgeThreshold(bool isUnlocked) { if (!isUnlocked) return dodgeThreshold; return Mathf.Max(2, Mathf.RoundToInt(dodgeThreshold * unlockedThresholdMultiplier)); } public float GetEffectiveAimThreshold(bool isUnlocked) { if (!isUnlocked) return aimThreshold; return aimThreshold * unlockedThresholdMultiplier; } public float GetEffectivePierceThreshold(bool isUnlocked) { if (!isUnlocked) return pierceThreshold; return pierceThreshold * unlockedThresholdMultiplier; } }