-
플레이어 피격 구현
public class HealthSystem : MonoBehaviour { public event Action OnDamage; [SerializeField] public float CurrentHealth { get; private set; } private void Start() { CurrentHealth = statsHandler.CurrentStat.statsSO.hp; } public bool ChangeHealth(float change) { if (timeSinceLastChange < healthChangeDelay) { return false; } timeSinceLastChange = 0f; CurrentHealth += change; // 최솟값을 0, 최댓값을 MaxHealth로 하는 구문. CurrentHealth = Mathf.Clamp(CurrentHealth, 0, MaxHealth); // CurrentHealth = CurrentHealth > MaxHealth ? MaxHealth : CurrentHealth; // CurrentHealth = CurrentHealth < 0 ? 0 : CurrentHealth; 와 같다 if (CurrentHealth <= 0f) { CallDeath(); return true; } if (change >= 0) { OnHeal?.Invoke(); } else { OnDamage?.Invoke(); // SoundManager.Instance.PlaySFX(DamageClipIdx); } return true; } }
먼저 HealthSystem에서 플레이어의 hp가 줄어들었을 때 OnDamage를 실행시켜준다.
public class Player : MonoBehaviour { public HealthSystem healthSystem { get; private set; } private void Start() { healthSystem.OnDamage += OnHurt; } public void OnHurt() { stateMachine.ChangeState(stateMachine.HurtState); } }
그 후 OnDamage에 OnHurt를 구독시켜 HurtState로 만든다.
private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag == "monster") { enemyDamage = collision.gameObject.GetComponent<StatHandler>().CurrentStat.statsSO.damage; healthSystem.ChangeHealth(-enemyDamage); OnDamaged(collision.transform.position); Debug.Log(healthSystem.CurrentHealth); } } private void OnDamaged(Vector2 targetPos) { int dirc = transform.position.x - targetPos.x > 0 ? 1: -1; Rigidbody.AddForce(new Vector2(dirc, 1) * 7, ForceMode2D.Impulse); }
그 후에 몬스터와 충돌했을 때 몬스터의 damage값을 가져와 체력을 깎는 로직을 만든다.
OnDamaged 메서드는 몬스터와 충돌 시에 현재 방향에 따라서 넉백을 시키는 메서드이다.
'개발일지 > 스파르타 코딩클럽 부트캠프' 카테고리의 다른 글
[TIL] 13주차 3일 기술 면접 대비 (0) 2024.07.10 [TIL] 13주차 2일 FSM에서 신경써야 할 부분 ( 트러블 슈팅 ) (2) 2024.07.09 [TIL] 12주차 5일 유니티 스킬 장착, 스킬 슬롯 로직 (0) 2024.07.05 [TIL] 12주차 3일 기술면접 대비 (0) 2024.07.05 [TIL] 12주차 4일 ( Raycast2D로 연속점프 방지하기 _ 트러블슈팅 ) (0) 2024.07.04