- 도발, 방어 태세, 철벽 스킬과 위협 생성 배율 시스템을 추가 - 치유, 광역 치유, 보호막 스킬과 관련 이상상태/이펙트 자산을 구성 - 보호막 흡수 로직과 체력 HUD 보너스 표시를 PlayerNetworkController, PlayerHUD, StatBar에 반영 - 플레이어 프리팹 슬롯과 디버그 메뉴를 확장해 탱킹·지원 스킬 검증 경로를 추가 - Unity 컴파일과 런타임 테스트에서 도발, 치유, 광역 치유, 보호막 발동 및 보호막 수치 적용을 확인
112 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|