OldBlueWater/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs
NTG 25ce12515e 전투 씬 Ui 추가
수정 내역
1. 아이템 인벤토리 씬별로 스크립트 구분
2. 전투씬에 GameOver, Clear, Menu Ui 추가

버그 수정 내역
1. 팝업UI 간의 충돌 버그 수정
2024-05-12 19:47:18 +09:00

117 lines
3.3 KiB
C#

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;
}
}
}
}