OldBlueWater/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs
NTG f1d0c6d371 Closes #244, #254 CombatPlayer 개선, 하트 시스템 추가
+ CombatPlayer 기능별 분리
+ Combat, CombatUi 전용 input action map 추가
+ 스킬 시스템 로직 수정
+ 전투플레이어 스킬(검의 왈츠) 로직 변경
2024-05-08 00:37:33 +09:00

108 lines
2.9 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;
// 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();
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 new WaitForSeconds(0.05f);
propBlock.SetInt(IsHitHash, 0);
spriteRenderer.SetPropertyBlock(propBlock);
yield return new WaitForSeconds(0.05f);
}
}
}
}