+ CombatPlayer 기능별 분리 + Combat, CombatUi 전용 input action map 추가 + 스킬 시스템 로직 수정 + 전투플레이어 스킬(검의 왈츠) 로직 변경
108 lines
2.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
} |