2024-05-07 15:37:33 +00:00
|
|
|
using System.Collections;
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
|
|
namespace BlueWaterProject
|
|
|
|
{
|
|
|
|
public class CombatHealth : MonoBehaviour, IDamageable
|
|
|
|
{
|
|
|
|
// Components
|
2024-05-11 21:29:16 +00:00
|
|
|
private SpriteRenderer flashWhiteSpriteRenderer;
|
2024-05-07 15:37:33 +00:00
|
|
|
|
|
|
|
// Health
|
|
|
|
[SerializeField] private int maxHp;
|
|
|
|
[SerializeField] private int currentHp;
|
2024-05-11 21:29:16 +00:00
|
|
|
[SerializeField] private float takeDamageCoolDown = 0.5f;
|
2024-05-07 15:37:33 +00:00
|
|
|
|
2024-05-08 00:28:04 +00:00
|
|
|
// Variables
|
|
|
|
private WaitForSeconds flashWhiteWaitTime;
|
2024-05-11 21:29:16 +00:00
|
|
|
private bool enableTakeDamage = true;
|
2024-05-08 00:28:04 +00:00
|
|
|
|
2024-05-07 15:37:33 +00:00
|
|
|
// Hashes
|
|
|
|
private static readonly int IsHitHash = Shader.PropertyToID("_IsHit");
|
|
|
|
|
|
|
|
// events
|
|
|
|
public delegate void ChangedCurrentHp(int currentHp);
|
|
|
|
public event ChangedCurrentHp OnChangedCurrentHp;
|
|
|
|
|
|
|
|
// Unity events
|
|
|
|
private void Start()
|
|
|
|
{
|
2024-05-11 21:29:16 +00:00
|
|
|
OnChangedCurrentHp += CombatUiManager.Inst.HeartHpUi.SetCurrentHp;
|
2024-05-08 02:59:17 +00:00
|
|
|
|
2024-05-11 21:29:16 +00:00
|
|
|
flashWhiteWaitTime = new WaitForSeconds(takeDamageCoolDown * 0.1f);
|
2024-05-07 15:37:33 +00:00
|
|
|
SetCurrentHp(maxHp);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnDestroy()
|
|
|
|
{
|
2024-05-11 21:29:16 +00:00
|
|
|
if (CombatUiManager.Inst)
|
|
|
|
{
|
|
|
|
OnChangedCurrentHp -= CombatUiManager.Inst.HeartHpUi.SetCurrentHp;
|
|
|
|
}
|
2024-05-07 15:37:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Init
|
|
|
|
public void InitComponent(SpriteRenderer spriteRenderer)
|
|
|
|
{
|
2024-05-11 21:29:16 +00:00
|
|
|
flashWhiteSpriteRenderer = spriteRenderer;
|
2024-05-07 15:37:33 +00:00
|
|
|
}
|
2024-05-11 21:29:16 +00:00
|
|
|
|
|
|
|
// Events methods
|
|
|
|
public void HandleEnableTakeDamage() => enableTakeDamage = true;
|
|
|
|
public void HandleDisableTakeDamage() => enableTakeDamage = false;
|
2024-05-07 15:37:33 +00:00
|
|
|
|
|
|
|
// Methods
|
|
|
|
public void TakeDamage(float attackerPower, Vector3? attackPos = null)
|
|
|
|
{
|
2024-05-11 21:29:16 +00:00
|
|
|
if (!enableTakeDamage) return;
|
|
|
|
|
|
|
|
enableTakeDamage = false;
|
2024-05-07 15:37:33 +00:00
|
|
|
var changeHp = Mathf.Max(currentHp - (int)attackerPower, 0);
|
|
|
|
SetCurrentHp(changeHp);
|
|
|
|
|
|
|
|
// 죽었는지 체크
|
|
|
|
if (changeHp == 0f)
|
|
|
|
{
|
|
|
|
Die();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
StartCoroutine(nameof(FlashWhiteCoroutine));
|
2024-05-11 21:29:16 +00:00
|
|
|
StartCoroutine(Utils.CoolDown(takeDamageCoolDown, HandleEnableTakeDamage));
|
2024-05-07 15:37:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void Die()
|
|
|
|
{
|
2024-05-11 21:29:16 +00:00
|
|
|
CombatUiManager.Inst.GameOverPopupUi.Open();
|
2024-05-12 08:41:13 +00:00
|
|
|
Destroy(gameObject);
|
2024-05-07 15:37:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public float GetCurrentHp()
|
|
|
|
{
|
|
|
|
return currentHp;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void SetCurrentHp(int value)
|
|
|
|
{
|
|
|
|
currentHp = value;
|
|
|
|
OnChangedCurrentHp?.Invoke(value);
|
2024-05-12 08:41:13 +00:00
|
|
|
|
|
|
|
if (currentHp <= 2)
|
|
|
|
{
|
|
|
|
CameraManager.Inst.CombatCamera.LowHpVignette();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CameraManager.Inst.CombatCamera.DefaultHpVignette();
|
|
|
|
}
|
2024-05-07 15:37:33 +00:00
|
|
|
}
|
2024-05-11 21:29:16 +00:00
|
|
|
|
|
|
|
private void SetMaxHp()
|
|
|
|
{
|
|
|
|
SetCurrentHp(maxHp);
|
|
|
|
}
|
2024-05-07 15:37:33 +00:00
|
|
|
|
|
|
|
private IEnumerator FlashWhiteCoroutine()
|
|
|
|
{
|
|
|
|
for (var i = 0; i < 5; i++)
|
|
|
|
{
|
2024-05-11 21:29:16 +00:00
|
|
|
flashWhiteSpriteRenderer.material.SetInt(IsHitHash, 1);
|
2024-05-08 00:28:04 +00:00
|
|
|
yield return flashWhiteWaitTime;
|
2024-05-11 21:29:16 +00:00
|
|
|
flashWhiteSpriteRenderer.material.SetInt(IsHitHash, 0);
|
2024-05-08 00:28:04 +00:00
|
|
|
yield return flashWhiteWaitTime;
|
2024-05-07 15:37:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|