using System.Collections; using UnityEngine; using UnityEngine.UI; namespace Streamingle.Contents.BossRaid { /// /// 유저 피격 시 빨간 비네트 오버레이 + NiloToon 색상 플래시. /// public class PlayerHitEffect : MonoBehaviour { #region Fields // PlayerData에서 값을 읽되, 없으면 기본값 사용 private Color vignetteColor = new Color(1f, 0f, 0f, 0.4f); private float vignetteDuration = 0.4f; private Color hitTintColor = new Color(1f, 0.3f, 0.3f); private float tintDuration = 0.3f; private Canvas _canvas; private Image _vignetteImage; private Coroutine _vignetteCoroutine; private Coroutine _tintCoroutine; private PlayerController _player; #endregion #region Unity Messages private void Awake() { CreateVignetteUI(); } #endregion #region Public Methods public void Play(PlayerController player) { _player = player; // PlayerData에서 값 읽기 if (player?.Data != null) { vignetteColor = player.Data.vignetteColor; vignetteDuration = player.Data.vignetteDuration; hitTintColor = player.Data.hitTintColor; tintDuration = player.Data.hitTintDuration; } if (_vignetteCoroutine != null) StopCoroutine(_vignetteCoroutine); _vignetteCoroutine = StartCoroutine(VignetteCoroutine()); if (_tintCoroutine != null) StopCoroutine(_tintCoroutine); _tintCoroutine = StartCoroutine(TintCoroutine()); } #endregion #region Private Methods private IEnumerator VignetteCoroutine() { _vignetteImage.color = vignetteColor; float elapsed = 0f; while (elapsed < vignetteDuration) { elapsed += Time.deltaTime; float t = elapsed / vignetteDuration; var c = vignetteColor; c.a = vignetteColor.a * (1f - t); _vignetteImage.color = c; yield return null; } _vignetteImage.color = Color.clear; _vignetteCoroutine = null; } private IEnumerator TintCoroutine() { if (_player == null) yield break; _player.FlashHitColor(hitTintColor); yield return new WaitForSeconds(tintDuration * 0.3f); // 부드럽게 원래 색상으로 float elapsed = 0f; float fadeDur = tintDuration * 0.7f; while (elapsed < fadeDur) { elapsed += Time.deltaTime; float t = elapsed / fadeDur; Color c = Color.Lerp(hitTintColor, Color.white, t); _player.FlashHitColor(c); yield return null; } _player.RestoreColor(); _tintCoroutine = null; } private void CreateVignetteUI() { var canvasObj = new GameObject("BossRaid_PlayerVignette"); canvasObj.transform.SetParent(transform); _canvas = canvasObj.AddComponent(); _canvas.renderMode = RenderMode.ScreenSpaceOverlay; _canvas.sortingOrder = 997; _vignetteImage = canvasObj.AddComponent(); _vignetteImage.color = Color.clear; _vignetteImage.raycastTarget = false; } #endregion } }