+ UiManager의 CombatUi, OceanUi 모두 분리 각각의 씬에서 CombatUiManager, OceanUiManager로 변경 + Ocean, OceanUi input action map 추가 및 변경 input action map, uiManager 변경에 따른 Player input 로직 변경 + CombatPlayer가 죽으면 GameOverUi 추가 + 재시작 기능 추가 + 인벤토리 Ui 수정 + 슬라임 보스 로직 및 애니메이션 수정
118 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |