2026-02-12 15:23:25 +00:00
|
|
|
using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을
|
2026-02-10 15:29:22 +00:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 보스 카운터 시스템의 임계치, 가중치, 감소(Decay) 설정을 담는 ScriptableObject.
|
|
|
|
|
/// Inspector에서 밸런싱을 위해 쉽게 조정할 수 있습니다.
|
|
|
|
|
/// </summary>
|
2026-02-12 15:23:25 +00:00
|
|
|
[CreateAssetMenu(fileName = "BossCounterConfig", menuName = "Boss/Counter Config")] // 메뉴를 만들거에요 -> 에셋 생성 메뉴에 "Boss/Counter Config"를
|
|
|
|
|
public class BossCounterConfig : ScriptableObject // 클래스를 선언할거에요 -> ScriptableObject를 상속받는 BossCounterConfig를
|
2026-02-10 15:29:22 +00:00
|
|
|
{
|
2026-02-12 15:23:25 +00:00
|
|
|
[Header("══ 기본 임계치 (첫 런 / 잠금 해제 전) ══")] // 인스펙터 창에 제목을 표시할거에요 -> ══ 기본 임계치 (첫 런 / 잠금 해제 전) ══ 을
|
|
|
|
|
[Tooltip("회피 카운터 발동 조건: 10초 내 회피 횟수")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public int dodgeThreshold = 5; // 변수를 선언할거에요 -> 회피 횟수 임계값(5)을 dodgeThreshold에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Tooltip("조준 카운터 발동 조건: 10초 내 조준 유지 시간(초)")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public float aimThreshold = 4.0f; // 변수를 선언할거에요 -> 조준 시간 임계값(4.0초)을 aimThreshold에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Tooltip("관통 카운터 발동 조건: 10초 내 관통 비율")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
[Range(0f, 1f)] // 슬라이더를 표시할거에요 -> 0부터 1 사이로
|
|
|
|
|
public float pierceThreshold = 0.6f; // 변수를 선언할거에요 -> 관통 비율 임계값(60%)을 pierceThreshold에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Tooltip("관통 비율 판단을 위한 최소 발사 횟수")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public int minShotsForPierceCheck = 3; // 변수를 선언할거에요 -> 최소 발사 횟수(3)를 minShotsForPierceCheck에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Header("══ 잠금 해제 후 임계치 감소 ══")] // 인스펙터 창에 제목을 표시할거에요 -> ══ 잠금 해제 후 임계치 감소 ══ 를
|
|
|
|
|
[Tooltip("잠금 해제된 카운터의 임계치 감소 비율 (0.8 = 20% 낮아짐)")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
[Range(0.5f, 1.0f)] // 슬라이더를 표시할거에요 -> 0.5부터 1.0 사이로
|
|
|
|
|
public float unlockedThresholdMultiplier = 0.8f; // 변수를 선언할거에요 -> 잠금 해제 시 감소 배율(0.8)을 unlockedThresholdMultiplier에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Header("══ 가중치 설정 (확률 가중치 방식) ══")] // 인스펙터 창에 제목을 표시할거에요 -> ══ 가중치 설정 (확률 가중치 방식) ══ 을
|
|
|
|
|
[Tooltip("카운터 발동 시 해당 카운터 패턴에 추가되는 가중치")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public float counterWeightBonus = 3f; // 변수를 선언할거에요 -> 카운터 패턴 보너스 가중치(3.0)를 counterWeightBonus에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Tooltip("카운터 발동 시 보조 패턴에 추가되는 가중치")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public float counterSubWeightBonus = 2f; // 변수를 선언할거에요 -> 보조 패턴 보너스 가중치(2.0)를 counterSubWeightBonus에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Header("══ Decay(감소) 설정 ══")] // 인스펙터 창에 제목을 표시할거에요 -> ══ Decay(감소) 설정 ══ 을
|
|
|
|
|
[Tooltip("카운터 모드 유지 시간(초). 이 시간 동안 조건 미충족 시 비활성화")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public float counterDecayTime = 8f; // 변수를 선언할거에요 -> 카운터 유지 시간(8.0초)을 counterDecayTime에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Header("══ 빈도 제한 ══")] // 인스펙터 창에 제목을 표시할거에요 -> ══ 빈도 제한 ══ 을
|
|
|
|
|
[Tooltip("카운터 패턴 선택 확률 상한 (0.25 = 최대 25%)")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
[Range(0.1f, 0.5f)] // 슬라이더를 표시할거에요 -> 0.1부터 0.5 사이로
|
|
|
|
|
public float maxCounterFrequency = 0.25f; // 변수를 선언할거에요 -> 카운터 최대 빈도(25%)를 maxCounterFrequency에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Tooltip("카운터 패턴 발동 후 쿨타임(초)")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
public float counterCooldown = 5f; // 변수를 선언할거에요 -> 카운터 재사용 대기시간(5.0초)을 counterCooldown에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
[Header("══ 습관 변경 보상 ══")] // 인스펙터 창에 제목을 표시할거에요 -> ══ 습관 변경 보상 ══ 을
|
|
|
|
|
[Tooltip("플레이어가 이전 런에서 발동된 카운터 습관을 이번 런에서 안 보이면, 보스 일반 패턴 난이도 감소 비율")] // 마우스를 올리면 설명을 보여줄거에요 -> 툴팁 내용을
|
|
|
|
|
[Range(0f, 0.3f)] // 슬라이더를 표시할거에요 -> 0부터 0.3 사이로
|
|
|
|
|
public float habitChangeRewardRatio = 0.15f; // 변수를 선언할거에요 -> 습관 변경 보상 비율(15%)을 habitChangeRewardRatio에
|
2026-02-10 15:29:22 +00:00
|
|
|
|
|
|
|
|
// ═══════════════════════════════════════════
|
|
|
|
|
// 임계치 조회 (잠금 해제 여부 반영)
|
|
|
|
|
// ═══════════════════════════════════════════
|
|
|
|
|
|
|
|
|
|
/// <summary>현재 유효 임계치 반환 (잠금 해제 시 낮아짐)</summary>
|
2026-02-12 15:23:25 +00:00
|
|
|
public int GetEffectiveDodgeThreshold(bool isUnlocked) // 함수를 선언할거에요 -> 잠금 해제 여부에 따른 회피 임계값을 반환하는 GetEffectiveDodgeThreshold를
|
2026-02-10 15:29:22 +00:00
|
|
|
{
|
2026-02-12 15:23:25 +00:00
|
|
|
if (!isUnlocked) return dodgeThreshold; // 조건이 맞으면 반환할거에요 -> 잠금 상태라면 기본 임계값을
|
|
|
|
|
return Mathf.Max(2, Mathf.RoundToInt(dodgeThreshold * unlockedThresholdMultiplier)); // 값을 계산해서 반환할거에요 -> 기본값에 배율을 곱하고 최소 2 이상이 되도록
|
2026-02-10 15:29:22 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
public float GetEffectiveAimThreshold(bool isUnlocked) // 함수를 선언할거에요 -> 잠금 해제 여부에 따른 조준 임계값을 반환하는 GetEffectiveAimThreshold를
|
2026-02-10 15:29:22 +00:00
|
|
|
{
|
2026-02-12 15:23:25 +00:00
|
|
|
if (!isUnlocked) return aimThreshold; // 조건이 맞으면 반환할거에요 -> 잠금 상태라면 기본 임계값을
|
|
|
|
|
return aimThreshold * unlockedThresholdMultiplier; // 값을 계산해서 반환할거에요 -> 기본값에 배율을 곱한 값을
|
2026-02-10 15:29:22 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-12 15:23:25 +00:00
|
|
|
public float GetEffectivePierceThreshold(bool isUnlocked) // 함수를 선언할거에요 -> 잠금 해제 여부에 따른 관통 임계값을 반환하는 GetEffectivePierceThreshold를
|
2026-02-10 15:29:22 +00:00
|
|
|
{
|
2026-02-12 15:23:25 +00:00
|
|
|
if (!isUnlocked) return pierceThreshold; // 조건이 맞으면 반환할거에요 -> 잠금 상태라면 기본 임계값을
|
|
|
|
|
return pierceThreshold * unlockedThresholdMultiplier; // 값을 계산해서 반환할거에요 -> 기본값에 배율을 곱한 값을
|
2026-02-10 15:29:22 +00:00
|
|
|
}
|
2026-02-12 15:23:25 +00:00
|
|
|
}
|