using System.Collections;
using UnityEngine;
using UnityEngine.UI;
namespace Streamingle.Contents.BossRaid
{
///
/// 승리 결과 화면 UI.
/// "YOU WIN!" + 전투 스탯 요약.
///
public class VictoryScreen : MonoBehaviour
{
#region Fields
[Header("설정")]
[SerializeField] private float titleAppearDelay = 0.3f;
[SerializeField] private float statsAppearDelay = 0.8f;
[SerializeField] private float statLineInterval = 0.2f;
[Header("비주얼")]
[SerializeField] private Color titleColor = new Color(1f, 0.85f, 0.2f);
[SerializeField] private Color statLabelColor = new Color(0.7f, 0.7f, 0.7f);
[SerializeField] private Color statValueColor = new Color(0.3f, 1f, 0.5f);
private Canvas _canvas;
private CanvasGroup _canvasGroup;
private Text _titleText;
private Text _statsText;
private Coroutine _showCoroutine;
private Font _font;
#endregion
#region Unity Messages
private void Awake()
{
_font = BossRaidFontLoader.Load();
CreateUI();
_canvasGroup.alpha = 0f;
}
#endregion
#region Public Methods
public void Show(BossRaidResult result)
{
if (_showCoroutine != null)
StopCoroutine(_showCoroutine);
_showCoroutine = StartCoroutine(ShowCoroutine(result));
}
public void Hide()
{
if (_showCoroutine != null)
{
StopCoroutine(_showCoroutine);
_showCoroutine = null;
}
_canvasGroup.alpha = 0f;
}
#endregion
#region Private Methods
private IEnumerator ShowCoroutine(BossRaidResult result)
{
_canvasGroup.alpha = 1f;
_titleText.text = "";
_statsText.text = "";
yield return new WaitForSecondsRealtime(titleAppearDelay);
_titleText.text = "YOU WIN!";
yield return StartCoroutine(PunchScale(_titleText.rectTransform, 0.4f, 1.5f));
yield return new WaitForSecondsRealtime(statsAppearDelay);
string[] lines = new string[]
{
$"Boss: {result.bossName}",
$"Time: {FormatTime(result.elapsedTime)}",
$"Total Damage: {result.totalDamage:N0}",
$"Hits: {result.hitCount}",
$"Criticals: {result.criticalCount}",
$"Max Combo: {result.maxCombo}",
};
_statsText.text = "";
foreach (var line in lines)
{
_statsText.text += line + "\n";
yield return new WaitForSecondsRealtime(statLineInterval);
}
}
private IEnumerator PunchScale(RectTransform rect, float duration, float punchSize)
{
Vector3 baseScale = Vector3.one;
Vector3 punchScale = baseScale * punchSize;
float elapsed = 0f;
while (elapsed < duration)
{
elapsed += Time.unscaledDeltaTime;
float t = elapsed / duration;
float ease = 1f - Mathf.Pow(2f, -10f * t) * Mathf.Cos(t * Mathf.PI * 3f);
rect.localScale = Vector3.LerpUnclamped(punchScale, baseScale, ease);
yield return null;
}
rect.localScale = baseScale;
}
private string FormatTime(float seconds)
{
int min = Mathf.FloorToInt(seconds / 60f);
float sec = seconds % 60f;
return min > 0 ? $"{min}m {sec:F1}s" : $"{sec:F1}s";
}
private void CreateUI()
{
var canvasObj = new GameObject("BossRaid_VictoryScreen");
canvasObj.transform.SetParent(transform);
_canvas = canvasObj.AddComponent