본문 바로가기

Unreal

UE - 프로젝트 프로토 타입 - 슈팅 프로젝트(충돌 처리)

충돌 처리 목표

총알과 Enemy, 플레이어와 Enemy의 충돌 처리

 

 

 

구현 순서

  1. 충돌 영역 설정, 충돌 처리를 위한 채널 추가
  2. 어떤 대상과 충돌이 발생하게 할 것인지 설정
  3. 충돌 발생 이벤트 함수를 이용, 충돌 시 실행할 기능 구현
  4. 화면 밖으로 나간 오브젝트를 제거하는 지대 설치. (KillZone)

 

1. Collision(충돌 영역) 생성

액터들 간의 충돌을 발생시키기 위해서는 어디서부터 어디까지 충돌할 수 있는지 충돌 영역 설정이 필요.
이러한 충돌 영역을 Collision이라고 부릅니다.
액터 외형 그대로 충돌 영역을 설정할 수도 있지만 충돌 영역의 형태가 복잡할수록 CPU에서 충돌했는지 여부를 계산할 때 부하가 많이 걸리기 떄문에 특별한 경우를 제외하고는 가급적 단순한 형태로 영역을 설정하는 것이 최적화 관점에서 일반적인 방식입니다.

 

 

 

충돌 처리를 설정할 액터들 간에 Collision Group 생성

언리얼 에디터 상단 Edit → Project Settings를 클릭, Collision 탭 선택

  • Object : Collision간 충돌을 처리할 때 사용
  • Trace : Ray Tracing 기능을 이용한 충돌 처리 시 사용

 

 

충돌체의 응답 Response

  • Ignore : 부딪혀도 충돌했다는 이벤트를 무시
  • Overlap : 충돌했다는 이벤트(감지)는 발생시키지만, 물리적으로 밀어내지는 않는다.
  • Block : 충돌했다는 이벤트(감지)를 발생시키면서 동시에 물리적으로도 밀어낸다.

 

 

서로 다른 응답을 가진 오브젝트끼리의 충돌

  • Ignore vs Ignore ⇒ Ignore
  • Ignore vs Overlap ⇒ Ignore
  • Ignore vs Block ⇒ Ignore
  • Overlap vs Overlap ⇒ Overlap
  • Overlap vs Block ⇒ Overlap
  • Block vs Block ⇒ Block

 

2. 충돌 설정(총알 과의 충돌 예시)

Enemy 객체에 한해서만 Overlap 설정 Enemy 객체와 부딪히면 물리 현상이 필요한 것이 아니라 폭발해서 사라지게 할 것이므로 충돌 감지 기능만 있으면 됩니다.

 

 

 

Collision Enabled

  • No Collision : 감지와 물리 작용 모두 사용하지 않는 상태
  • Query Only : 감지(Overlap) 기능만 동작하는 상태
  • Physics Only : 물리 작용(Physic) 기능만 동작하는 상태
  • Collision Enabled : 감지와 물리 작용 모두 동작하는 상태

 

 

Bullet Collision

 

 

3. 충돌 이벤트 구현 (ActorBeginOverlap)

  1. 부딪힌 객체가 BP_Enemy라면 캐스팅을 실행합니다.
  2. BP_Enemy 인스턴스를 Destroy 합니다.
  3. 자기 자신 BP_Bullet 인스턴스를 Destroy 합니다.
  4. 주의 사항 : 자기 자신이 먼저 제거되면 Enemy를 제거할 수 없습니다.

 

충돌 시 이펙트 생성(BP_Bullet)

  1. Event ActorBeginOverlap
  2. 충돌 객체(Other Actor)를 BP_Enemy인스턴스로 Casting
  3. BP_Enemy 인스턴스를 삭제
  4. 현재 BP_Bullet 인스턴스 위치를 받아오기
  5. Particle System연결(Spawn Emitter at Location)
  6. Destroy Actor(Self) 자기 자신 삭제

 

충돌 시 플레이어 삭제(BP_Enemy)

 

 

충돌 시 플레이어가 삭제되면 발생하는 오류

이전 포스팅에서 BP_Enemy 블루프린트가 플레이어 방향으로 이동하게 구현한 로직때문에 플레이어가 삭제되자
플레이어의 방향을 알 수 없게되서 발생한 에러입니다.

 

 

 

BP_Enemy 생성 로직 시 유효성 검사

BP_Player 인스턴스가 유효한지를 확인 한 이후 Set Direction으로 Enemy가 플레이어 방향으로 생성되게 합니다.
다만 이렇게 설정될 경우 방향 결정이 되어지지 않는 적들 이 멈춰있지만 Game Over 기능을 구현할 경우 문제되어지지 않습니다.

 

 

 

4. Kill Zone 제작

총알과 에너미가 계속 생성되는 액터에서 만일 아무것도 충돌되지 않은 채 화면 밖으로 나가게되면
무한히 넓은 월드 공간을 계속 떠돌게 됩니다.
플레이 시간이 길어질수록 화면 박에 있는 액터들의 수가 많아집니다. 불필요해진 액터들이 제거되지 않고 늘어나면 메모리 사용량을 침식합니다. 화면 바깥의 불필요한 액터를 제거하기 위한 킬 존을 설정합니다.

 

 

 

BP_KillZone

  • BoxCollision 추가

 

 

  • Object Channel 추가

 

 

 

KillZone의 Collision 설정

기본적으로 Overlap Player는 KillZone에 닿더라도 사라지면 안되므로 Ignore KillZone 인스턴스 끼리도 서로를 삭제하면 안되므로 Ignore 나머지 인스턴스의 경우에는 KillZone에 닿을 경우 제거.

 

 

 

KillZone Collision 설정

Y축을 길게 설정합니다.

 

 

KillZone 인스턴스 설정

X : 0, Y : 0 , Z : 1500 X : 0, Y : 0, Z : -1500

 

 

플레이어는 Ignore 설정되어 있지만 KillZone에 닿으면 삭제되는 문제 발생.

기본 Cube 모델링에 Collision이 부착되어 있기 때문.

 

 

 

기본 Cube 정보

Num Collision Primitives : 1 ⇒ 기본적으로 모델링 데이터 자체에 1개의 충돌체가 달려있습니다.

 

 

 

Static Mesh에서 Collision 동작 막기.

기본 Cube의 Collision을 비활성화 하기
⇒ Collision Presets에서 No Collision 선택 KillZone에 닿아도 Player가 삭제되지 않습니다.