using System.Collections; using UnityEngine; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class CombatHealth : MonoBehaviour, IDamageable { // Components private SpriteRenderer flashWhiteSpriteRenderer; // Health [SerializeField] private int maxHp; [SerializeField] private int currentHp; [SerializeField] private float takeDamageCoolDown = 0.5f; // Variables private WaitForSeconds flashWhiteWaitTime; private bool enableTakeDamage = true; // 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() { OnChangedCurrentHp += CombatUiManager.Inst.HeartHpUi.SetCurrentHp; flashWhiteWaitTime = new WaitForSeconds(takeDamageCoolDown * 0.1f); SetCurrentHp(maxHp); } private void OnDestroy() { if (CombatUiManager.Inst) { OnChangedCurrentHp -= CombatUiManager.Inst.HeartHpUi.SetCurrentHp; } } // Init public void InitComponent(SpriteRenderer spriteRenderer) { flashWhiteSpriteRenderer = spriteRenderer; } // Events methods public void HandleEnableTakeDamage() => enableTakeDamage = true; public void HandleDisableTakeDamage() => enableTakeDamage = false; // Methods public void TakeDamage(float attackerPower, Vector3? attackPos = null) { if (!enableTakeDamage) return; enableTakeDamage = false; var changeHp = Mathf.Max(currentHp - (int)attackerPower, 0); SetCurrentHp(changeHp); // 죽었는지 체크 if (changeHp == 0f) { Die(); return; } StartCoroutine(nameof(FlashWhiteCoroutine)); StartCoroutine(Utils.CoolDown(takeDamageCoolDown, HandleEnableTakeDamage)); } public void Die() { CombatUiManager.Inst.GameOverPopupUi.Open(); Destroy(gameObject); } public float GetCurrentHp() { return currentHp; } private void SetCurrentHp(int value) { currentHp = value; OnChangedCurrentHp?.Invoke(value); if (currentHp <= 2) { CameraManager.Inst.CombatCamera.LowHpVignette(); } else { CameraManager.Inst.CombatCamera.DefaultHpVignette(); } } private void SetMaxHp() { SetCurrentHp(maxHp); } private IEnumerator FlashWhiteCoroutine() { for (var i = 0; i < 5; i++) { flashWhiteSpriteRenderer.material.SetInt(IsHitHash, 1); yield return flashWhiteWaitTime; flashWhiteSpriteRenderer.material.SetInt(IsHitHash, 0); yield return flashWhiteWaitTime; } } } }