언리얼 데미지 프레임워크와 죽음 처리 정리 (TakeDamage)

언리얼 데미지/죽음 처리 학습 노트. 강의 7.3~7.4에서 개념만 추림. 데미지 흐름이나 죽음 처리 헷갈릴 때 다시 보기.

TakeDamage() 데미지 프레임워크

감지된 액터에 데미지를 전달하는 표준 프레임워크. 핵심은 AActor::TakeDamage(). 공격자가 피격자의 TakeDamage()를 호출하는 구조.

인자 네 개:

  • DamageAmount: 데미지 세기
  • DamageEvent: 데미지 종류
  • EventInstigator: 공격 명령 내린 컨트롤러
  • DamageCauser: 데미지에 사용된 액터 (투사체, 무기 등)

피격 처리는 TakeDamage()를 override해서 구현. Super::TakeDamage()가 반환하는 값이 실제 적용된 데미지. 이걸 받아서 HP를 깎는 게 기본 패턴.

함정: bCanBeDamaged 속성

모든 액터에 CanBeDamaged 속성 있음. false면 전달된 데미지 결과가 전부 0이 되는 무적 상태. 데미지가 안 들어갈 때 이거부터 확인. (TakeDamage 로직 자체보다 이 속성 때문인 경우가 많음)

HP와 죽음 처리 흐름

기본 흐름:

  • TakeDamage에서 CurrentHP를 FMath::Clamp로 0~MaxHP 범위에서 깎음
  • HP가 0 근처면(KINDA_SMALL_NUMBER 비교) bIsDead = true 처리
  • 죽으면 캡슐 컴포넌트 콜리전을 NoCollision으로, MovementMode를 None으로 → 시체가 충돌/이동 안 하게

함정: HP 비교를 == 0으로 하지 말 것. 부동소수점이라 정확히 0 안 될 수 있음. KINDA_SMALL_NUMBER(0.0001f) 미만으로 비교.

죽음 → 애니메이션 → 정리의 타이밍 문제

죽자마자 액터를 바로 Destroy하면 죽는 애니메이션이 안 나옴. 그래서 애니메이션 노티파이를 거치는 구조를 씀.

흐름:

  • 죽음 판정 → 죽는 애니메이션 재생
  • 애니메이션 타임라인 특정 시점에 노티파이(PostDead) 배치
  • 노티파이 → 델리게이트 브로드캐스트 → 캐릭터가 받아서 SetLifeSpan으로 잠시 후 제거

핵심은 "죽음 판정"과 "액터 제거"를 분리하고, 그 사이를 애니메이션 노티파이가 잇는다는 것. 애님 인스턴스에서 AnimNotify_함수명 규칙으로 노티파이 함수 선언하면 타임라인 노티파이와 연결됨.

죽는 애니메이션 자체는 AnimGraph에서 Blend Poses by bool로 bIsDead 분기. 애님 인스턴스의 NativeUpdateAnimation에서 캐릭터의 IsDead()를 매 프레임 동기화.

상자(트리거) 액터에서 다시 볼 패턴

7.4 상자 실습에서 개념적으로 기억할 것만:

트리거 박스 기본 구성: BoxComponent를 루트로, OnComponentBeginOverlap 델리게이트에 함수 바인드, 콜리전 프리셋은 Trigger 또는 전용 프리셋. 메시는 NoCollision(보여주기만), 박스가 감지 담당. 역할 분리가 포인트.

이펙트 후 자기 제거 패턴: 오버랩 발생 → 파티클 Activate + 메시 숨김 + 콜리전 끄기 → 파티클의 OnSystemFinished 델리게이트에 Destroy 바인드. 즉 "이펙트가 끝나면 사라진다"를 델리게이트 체인으로 연결. 죽음 처리에서 본 "이벤트가 끝나는 시점을 노티파이/델리게이트로 잡아서 제거"와 같은 패턴.

전용 콜리전 프리셋 만들 때: 박스는 Query Only(물리 반응 필요 없음, 감지만), Object Type은 전용 채널, 캐릭터 채널과만 Overlap 지정. 양쪽 프리셋 모두에서 서로를 Overlap으로 잡아줘야 이벤트 발생(앞 글의 "양쪽 다 설정해야 한다" 함정과 동일).

관통하는 핵심

이번 절 전체를 관통하는 패턴 하나: "어떤 동작의 종료 시점"을 직접 타이밍 재서 처리하지 말고, 애니메이션 노티파이나 델리게이트(OnSystemFinished 등)로 잡아서 다음 동작을 잇는다. 죽음 처리도, 상자 소멸도 같은 구조. 이걸 기억해두면 비슷한 상황에서 바로 응용 가능.

+ Recent posts