OldBlueWater/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs

112 lines
3.1 KiB
C#

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<IDashable>();
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;
}
}
}
}