feat: 플레이어 탱킹 및 지원 스킬 1차 구현
- 도발, 방어 태세, 철벽 스킬과 위협 생성 배율 시스템을 추가 - 치유, 광역 치유, 보호막 스킬과 관련 이상상태/이펙트 자산을 구성 - 보호막 흡수 로직과 체력 HUD 보너스 표시를 PlayerNetworkController, PlayerHUD, StatBar에 반영 - 플레이어 프리팹 슬롯과 디버그 메뉴를 확장해 탱킹·지원 스킬 검증 경로를 추가 - Unity 컴파일과 런타임 테스트에서 도발, 치유, 광역 치유, 보호막 발동 및 보호막 수치 적용을 확인
This commit is contained in:
111
Assets/_Game/Scripts/Combat/ThreatController.cs
Normal file
111
Assets/_Game/Scripts/Combat/ThreatController.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/_Game/Scripts/Combat/ThreatController.cs.meta
Normal file
2
Assets/_Game/Scripts/Combat/ThreatController.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 28ce8e804d41f534e887036d4f43c3e3
|
||||
Reference in New Issue
Block a user