루리코딩 세상

Unreal Engine : Collision 충돌 시 Apply Damage 본문

이론/Unreal Engine

Unreal Engine : Collision 충돌 시 Apply Damage

루리딩 2025. 6. 7. 05:57

이전의 프로젝트 예제에서 [Create Dynamic Material]를 활용해서 원하는 색상으로 변경과,

기존의 Collision 기능을 활용해서 Actior가 사라지는 기능까지는 구현했으나

게임을 진행하게되면 HP를 일정한 공격에서 발생되는 Damage를 통해서 상쇄하는 로직이

기본적으로 게임의 가장 기본 요소인 것은 상식이다. 이번 프로젝트 예제는 이러한 데미지를

[BP_Sword]에 적용하여, 게임의 전투 요소 중 피격 시 발생되는 (데미지, 이펙트, 사운드, 화면 효과)

대표적인 효과들을 만들어보는 예제를 기록할 예정이다.


 

 

 

 

🟩 1. Apply Damage

기본 데미지 처리 함수 (범용)

  • 📌 설명: 대상 액터에 단순히 수치를 기반으로 데미지를 줌
  • 데미지 타입, 인스티게이터, 데미지 원인자 등을 포함 가능
  • 🔁 내부적으로 TakeDamage() 함수가 호출됨

사용 예시

  • 스킬, 트랩, 상태이상 등 명확한 타격 위치 없이 데미지를 줄 때
  • 간단한 데미지 로직 구현 시

🟦 2. Apply Point Damage

한 지점(Point)을 기준으로 한 데미지 처리

  • 📌 설명: 특정 위치와 방향이 있는 공격에 사용 (히트 스캔 기반)
  • 💥 맞은 뼈(Bone), 히트된 컴포넌트 등 정확한 충돌 정보 전달 가능
  • ✅ 보통 총알, 근접 공격, 스나이퍼 등에 사용

사용 예시

  • 특정 부위에 맞는지 판단하고자 할 때 (헤드샷 판정 등)
  • Skeletal Mesh의 특정 Bone에 따른 데미지 계산

🟠 3. Apply Radial Damage

폭발형 데미지 (방사형)

  • 📌 설명: 지점에서 반경 안에 있는 액터들에게 동일한 데미지를 가함
  • ✅ 지형, 장애물 등은 감안하지 않고 거리 기준으로 적용됨

사용 예시

  • 폭탄, 화염구, 마법 폭발 같은 AOE (Area of Effect)

🔵 4. Apply Radial Damage with Falloff

거리 감쇠 포함 방사형 데미지

  • 📌 설명: Apply Radial Damage와 유사하지만, 거리에 따라 데미지 감소
  • ✅ 중심에 가까울수록 강한 데미지, 가장자리일수록 약함
  • 🎯 최대/최소 데미지, 시작/종료 거리 설정 가능

사용 예시

  • 현실적인 폭발, 진동, 마법 효과 등
  • 중심 피해가 크고, 주변부는 약한 데미지를 줄 때

📊 요약 비교표

Apply Damage 범용 단순 데미지 트랩, 상태이상
Apply Point Damage 지점 타격 정확한 위치/부위 판정 총격, 근접 무기
Apply Radial Damage 범위 폭발 일정 반경 동일 데미지 수류탄, 마법
Apply Radial Damage with Falloff 감쇠 폭발 거리 따라 데미지 감소 화염구, 지진 등

[Apply Damage] 가 가장 중요한 부분인데,

[Get Owner] -> [Not Equal] -> [Branch] 로 연결되며, 참 거짓을 판단하는 로직으로 간다.

결과적으로 참일 경우 [Apply Damage]가 실행된다.

[Get Instigator Controller]는 공격을 전파해주는 [Event lnastigator]로

연결되는데 즉 (Overlap) 되고있는 (Capsule)이 해당된다.

[Damage Causer]는 데미지를 주는 자기자신[Self(BP_Sword)]가 된다.

 

여기까지의 노드가 데미지를 주는, 노드를 설정해주는 설정이고

데미지를 받는 객체(Objcet)에서도 설정을 해줘야한다 [BP_Enamy]로 넘어가자


 

[AnyDamage] 클래스를 선언해주자

변수로는 3가지를 선언해줬다.

[Health] [Max Health] [Attacker]

[BeginEvent]에서 시작된 노드에서 Set 문을 활용해 [Max Health] 100을 입력해주고

이후 발생되는 [AnyDamage]에서 데미지를 [Instigated By]를 통해서 이전에 입력한

'20'만큼씩 받는 로직인 것이다. [Clamp]에서 해당하는 범위를 지정하는데

(Min) = 0.0 (Max) = [ MaxHealth (100) ] 인 것을 알 수 있었다.