122 lines
3.5 KiB
C#
122 lines
3.5 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace Streamingle.Contents.BossRaid
|
|
{
|
|
/// <summary>
|
|
/// 유저 피격 시 빨간 비네트 오버레이 + NiloToon 색상 플래시.
|
|
/// </summary>
|
|
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>();
|
|
_canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
|
_canvas.sortingOrder = 997;
|
|
|
|
_vignetteImage = canvasObj.AddComponent<Image>();
|
|
_vignetteImage.color = Color.clear;
|
|
_vignetteImage.raycastTarget = false;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|