Files
Colosseum/Assets/_Game/Scripts/Combat/ThreatController.cs
dal4segno 0c7c7b0c12 feat: 플레이어 탱킹 및 지원 스킬 1차 구현
- 도발, 방어 태세, 철벽 스킬과 위협 생성 배율 시스템을 추가

- 치유, 광역 치유, 보호막 스킬과 관련 이상상태/이펙트 자산을 구성

- 보호막 흡수 로직과 체력 HUD 보너스 표시를 PlayerNetworkController, PlayerHUD, StatBar에 반영

- 플레이어 프리팹 슬롯과 디버그 메뉴를 확장해 탱킹·지원 스킬 검증 경로를 추가

- Unity 컴파일과 런타임 테스트에서 도발, 치유, 광역 치유, 보호막 발동 및 보호막 수치 적용을 확인
2026-03-24 19:17:16 +09:00

112 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace Colosseum.Combat
{
/// <summary>
/// 전투 중 생성하는 위협 배율을 관리합니다.
/// 탱커 스킬이 짧은 시간 동안 위협 생성량을 높이는 데 사용합니다.
/// </summary>
[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<TimedThreatModifier> activeModifiers = new List<TimedThreatModifier>();
/// <summary>
/// 현재 적용 중인 위협 생성 배율
/// </summary>
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();
}
}
/// <summary>
/// 일정 시간 동안 위협 생성 배율을 추가합니다.
/// </summary>
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");
}
}
/// <summary>
/// 모든 임시 위협 배율을 제거합니다.
/// </summary>
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;
}
}
}