루리코딩 세상

Unreal Engine : Collision 설정하기 본문

이론/Unreal Engine

Unreal Engine : Collision 설정하기

루리딩 2025. 6. 7. 03:53

그래픽 게임에서 충돌을 설정해주어야, 각 객체(Object) 간의 상호작용을 만들어낼 수 있다.

앞서서 프로젝트 예제를 통해서 하였던 실습들은 충돌과는 관련없는 애니메이션, 오브젝트를 소환하고

InPut값에 따른 행위를 노드로 실행하는 로직을 만들었다. 이번에는 Bot기능을 추가하기 이전에

충돌 기능을 설정함으로서 상호작용에 밑바탕을 만드는 것을 목적으로한다.


🔷 Collision 핵심 개념

1. Collision

  • 물체 간 충돌/감지를 처리하는 시스템
  • Block / Overlap / Ignore의 세 가지 반응 방식으로 구성됨

🔹 콜리전 구성 요소들

2. Collider

  • 충돌 처리를 위한 모양(Shape)
  • 메시와 별개로 충돌만 담당하는 보이지 않는 영역
  • 세 가지 주요 종류: Box, Sphere, Capsule

3. Box / Sphere / Capsule

종류설명
Box 사각형 형태의 충돌 (넓은 물체에 적합)
Sphere 구형 충돌체 (폭탄, 공 등 구형 오브젝트에 적합)
Capsule 사람형 캐릭터 충돌 기본값 (가장 자연스럽게 걷고 부딪힘 처리됨)
 

→ Add Component > Collision에서 추가 가능


4. Overlap

  • Block과 다르게 부딪히지 않고 겹치며 감지
  • 이벤트를 트리거하는 용도로 사용 (예: 아이템 줍기, 트랩 감지)
 

// 예: 오버랩 발생 시 함수 실행
OnComponentBeginOverlap.AddDynamic(this, &MyActor::OnOverlapBegin);


5. Component Begin Overlap

  • 컴포넌트 단위의 오버랩 이벤트 발생 시 호출
  • 블루프린트에서는 OnComponentBeginOverlap (Box, Sphere 등) 노드로 시각적으로 사용

💡 사용 예: 무기 범위 안에 들어오면 데미지 처리


6. ANS_Collision (Anim Notify State - Collision)

  • 애니메이션 동안 충돌 처리를 하기 위한 Notify
  • 주로 공격 애니메이션 중 무기의 충돌을 감지할 때 사용
[애니메이션 타임라인 중에 특정 프레임 구간 설정]
→ Notify State (ANS_Collision) 넣기
→ Begin/End에서 콜리전 활성화/비활성화

💡 예: 검 휘두를 때만 충돌 켜고, 끝나면 끄기


7. SetCollisionEnabled

  • 실시간으로 콜리전 활성/비활성 제어
blueprint
Set Collision Enabled (NoCollision)
Set Collision Enabled (QueryOnly)
Set Collision Enabled (PhysicsOnly)
Set Collision Enabled (QueryAndPhysics)

💡 무기나 방패가 부딪히지 않게 만들고 싶을 때 유용 (스폰 후 바로 끄기 등)


 

충돌체가 없는 기존의 오브젝트에 충돌체를

추가하는 것부터 기능을 넣을 것이다.

 

 

 

 

 

 

 

 

[Collision]을 넣을 컴포넌트 [Actior] 클래스의 [Capsule Collision] 을 추가했다.

[Box Collision] 박스 충돌체

[Sphere Collision] 박스 충돌체

[Capsule Collision] 박스 충돌체

 

Box 직육면체 정확한 위치 제어 모서리 끼임 가능 벽, 바닥, 큐브
Sphere 회전 무관, 반응 부드러움 각진 물체엔 부적합 범위 감지, 원형 충돌
Capsule 원기둥 + 반구 캐릭터 충돌 최적화 넓은 부피 캐릭터, NPC 충돌체

디테일 수정을 통한 충돌할 부위의 콜리전을 알맞게 배치했다.


그리드 기능을 끈 뒤에 세부적인 위치를 더 세밀하게 조절이 가능하다.

이제 본격적으로 노드를 설정해줬다.

 

테스트를 위해서, [Print String]으로

실행되도록 하였더니, 칼을 뽑고 넣을때

본인도 데미지를 입는 것을 볼 수 있었다.

 

이러한 문제를 해결하기 위해 아래의

노드처럼 설정을 해줬다.

Not Equal 기능과 Owner를 활용함

 

다음과 같이 충돌을 인식하는 노드를 설정하였으나 여러가지 문제점이 발생되었는데,

Holster에 장착되어있는 무기에도 충돌이 발생하는 문제점이

여전히 존재하는 것을 Print string으로 나타나는 것을 확인 할 수 있다.

- 게임에서는 무기를 휘두를 때 정확히 충돌이 발생하는 순간에만 출력되는 값이 필요로하다.

- 불필요한 상태에서 데미지를 입는 로직을 사전에 막아야한다.


 

오버랩 관리하기는 [디테일] - [콜리전]

[오버랩 이벤트 생성] 을 통해서 관리가 가능하나,

오버랩이 될 오브젝트도 마찬가지로 해당 디테일

활성화(체크)가 되어야, 정상적으로 충돌이 일어난다.

 

이러한 문제점을 해결하기 위해,

[Begin Event] 에서 해제하고, 원하는 액션에 다시 활성화 시키는 방법을 통해서 노드를 설정하려한다.


[BeginPlay], [Set Collision Enabled], [Capsule]을 사용하여, 시작시 충돌을 끈다.

 

 

 

 

 

 


 

 

[Set Collision Enabled] 설정에서 다른 점이 있었는데,

Notify Begin, End에서 각각 New Type에서 다양한 기능 중 알맞게 선택한다.

기능은 총 6가지가 있었다. 개별적인 것은 따로 정리해야겠다.

 

 

 

 

 

 


이제 동작의 데미지가 들어가는 구간을 [Montage] 노드의 [Notify] 기능으로 추가해줬다.

나의 경우에는 칼을 내려치기 위해서 올린 순간부터 충돌을 인식 할 수 있도록

[Shift] 기능을 활용해서 원하는 동작에 알맞게 배치했다.


 

마지막으로 [Destroy Actor] 기능을 통해서,

충돌된 Ohter Actor를 메모리에서 제거되는

로직을 추가해봤다.

 

정상적으로 메모리가 월드에서 제거되는 것을

확인 가능했다.

 

이제 본격적으로 적을 만들어보자........