78 lines
3.3 KiB
C#
78 lines
3.3 KiB
C#
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 보스 카운터 시스템의 임계치, 가중치, 감소(Decay) 설정을 담는 ScriptableObject.
|
||
|
|
/// Inspector에서 밸런싱을 위해 쉽게 조정할 수 있습니다.
|
||
|
|
///
|
||
|
|
/// [사용법] Project 창에서 우클릭 → Create → Boss/Counter Config
|
||
|
|
/// </summary>
|
||
|
|
[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;
|
||
|
|
|
||
|
|
// ═══════════════════════════════════════════
|
||
|
|
// 임계치 조회 (잠금 해제 여부 반영)
|
||
|
|
// ═══════════════════════════════════════════
|
||
|
|
|
||
|
|
/// <summary>현재 유효 임계치 반환 (잠금 해제 시 낮아짐)</summary>
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
}
|