OldBlueWater/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs
NTG 7a2b5e9d02 Closes #255 거대 슬라임 보스 추가
+ UiManager의 CombatUi, OceanUi 모두 분리
각각의 씬에서 CombatUiManager, OceanUiManager로 변경
+ Ocean, OceanUi input action map 추가 및 변경
input action map, uiManager 변경에 따른 Player input 로직 변경
+ CombatPlayer가 죽으면 GameOverUi 추가
+ 재시작 기능 추가
+ 인벤토리 Ui 수정
+ 슬라임 보스 로직 및 애니메이션 수정
2024-05-12 06:29:16 +09:00

118 lines
3.4 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;
CombatUiManager.Inst.GameOverPopupUi.OnRestartEvent += SetMaxHp;
flashWhiteWaitTime = new WaitForSeconds(takeDamageCoolDown * 0.1f);
SetCurrentHp(maxHp);
}
private void OnDestroy()
{
if (CombatUiManager.Inst)
{
OnChangedCurrentHp -= CombatUiManager.Inst.HeartHpUi.SetCurrentHp;
CombatUiManager.Inst.GameOverPopupUi.OnRestartEvent -= SetMaxHp;
}
}
// 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;
}
if (changeHp <= 2)
{
CameraManager.Inst.CombatCamera.LowHpVignette();
}
else
{
CameraManager.Inst.CombatCamera.StopLowHpVignette();
}
StartCoroutine(nameof(FlashWhiteCoroutine));
StartCoroutine(Utils.CoolDown(takeDamageCoolDown, HandleEnableTakeDamage));
}
public void Die()
{
CombatUiManager.Inst.GameOverPopupUi.Open();
}
public float GetCurrentHp()
{
return currentHp;
}
private void SetCurrentHp(int value)
{
currentHp = value;
OnChangedCurrentHp?.Invoke(value);
}
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;
}
}
}
}