using System.Collections; using UnityEngine; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class CombatHealth : MonoBehaviour, IDamageable { // Components private SpriteRenderer spriteRenderer; private HeartHpUi heartHpUi; private MaterialPropertyBlock propBlock; // Health [SerializeField] private int maxHp; [SerializeField] private int currentHp; // Interfaces private IDashable iDashable; // Variables private WaitForSeconds flashWhiteWaitTime; // 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() { heartHpUi = UiManager.Inst.CombatUi.HeartHpUi; iDashable = GetComponent(); OnChangedCurrentHp += heartHpUi.SetCurrentHp; propBlock = new MaterialPropertyBlock(); flashWhiteWaitTime = new WaitForSeconds(0.05f); SetCurrentHp(maxHp); } private void OnDestroy() { OnChangedCurrentHp -= heartHpUi.SetCurrentHp; } // Init public void InitComponent(SpriteRenderer spriteRenderer) { this.spriteRenderer = spriteRenderer; } // Methods public void TakeDamage(float attackerPower, Vector3? attackPos = null) { if (iDashable?.IsDashing == true) return; var changeHp = Mathf.Max(currentHp - (int)attackerPower, 0); SetCurrentHp(changeHp); // 죽었는지 체크 if (changeHp == 0f) { Die(); return; } if (changeHp <= 30f) { CameraManager.Inst.CombatCamera.LowHpVignette(); } else { CameraManager.Inst.CombatCamera.StopLowHpVignette(); } StartCoroutine(nameof(FlashWhiteCoroutine)); } public void Die() { throw new System.NotImplementedException(); } public float GetCurrentHp() { return currentHp; } private void SetCurrentHp(int value) { currentHp = value; OnChangedCurrentHp?.Invoke(value); } private IEnumerator FlashWhiteCoroutine() { for (var i = 0; i < 5; i++) { spriteRenderer.GetPropertyBlock(propBlock); propBlock.SetInt(IsHitHash, 1); spriteRenderer.SetPropertyBlock(propBlock); yield return flashWhiteWaitTime; propBlock.SetInt(IsHitHash, 0); spriteRenderer.SetPropertyBlock(propBlock); yield return flashWhiteWaitTime; } } } }