using System; using System.Collections.Generic; using UnityEngine; namespace Colosseum.Combat { /// /// 전투 중 생성하는 위협 배율을 관리합니다. /// 탱커 스킬이 짧은 시간 동안 위협 생성량을 높이는 데 사용합니다. /// [DisallowMultipleComponent] public class ThreatController : MonoBehaviour { [Serializable] private class TimedThreatModifier { [Min(0f)] public float multiplier = 1f; [Min(0f)] public float endTime; } [Header("Threat")] [Tooltip("기본 위협 생성 배율")] [Min(0f)] [SerializeField] private float baseThreatMultiplier = 1f; [Tooltip("디버그 로그 출력 여부")] [SerializeField] private bool debugMode = false; [Header("Debug")] [Tooltip("현재 적용 중인 위협 생성 배율")] [Min(0f)] [SerializeField] private float currentThreatMultiplier = 1f; private readonly List activeModifiers = new List(); /// /// 현재 적용 중인 위협 생성 배율 /// public float CurrentThreatMultiplier => currentThreatMultiplier; private void Awake() { RecalculateThreatMultiplier(); } private void Update() { if (activeModifiers.Count == 0) return; bool changed = false; for (int i = activeModifiers.Count - 1; i >= 0; i--) { if (Time.time < activeModifiers[i].endTime) continue; activeModifiers.RemoveAt(i); changed = true; } if (changed) { RecalculateThreatMultiplier(); } } /// /// 일정 시간 동안 위협 생성 배율을 추가합니다. /// public void ApplyThreatMultiplier(float multiplier, float duration) { if (multiplier <= 0f || duration <= 0f) return; activeModifiers.Add(new TimedThreatModifier { multiplier = multiplier, endTime = Time.time + duration, }); RecalculateThreatMultiplier(); if (debugMode) { Debug.Log($"[Threat] {gameObject.name} 위협 배율 적용: x{multiplier:F2} / {duration:F2}s"); } } /// /// 모든 임시 위협 배율을 제거합니다. /// public void ClearThreatModifiers() { if (activeModifiers.Count == 0) return; activeModifiers.Clear(); RecalculateThreatMultiplier(); } private void RecalculateThreatMultiplier() { float nextMultiplier = Mathf.Max(0f, baseThreatMultiplier); for (int i = 0; i < activeModifiers.Count; i++) { nextMultiplier *= Mathf.Max(0f, activeModifiers[i].multiplier); } currentThreatMultiplier = nextMultiplier; } } }