본문 바로가기

언리얼엔진/블루프린트슈팅게임만들기

충돌(Collision) 처리하기

콜리전 생성하기

BP_Bullet를 열어 Components +Add후 BoxCollision을 추가하고 이름을 BoxCollision으로 해줍니다. BoxCollision은 리전 처리를 위해서는 콜리전이 Root위치어야 합니다. DefaultSceneRoot위치로 드래그 해줍니다. Cube를 드래그해서 BoxCollision의 자식으로 넣어줍니다. 

뷰포트에서 보면 Cube와 BoxCollision의 사이즈가 맞지 않습니다. Bullet Scale을 변경했기 때문입니다. Collision의 Shape>BoxExtent를 다음과 같이 변경해서 맞춰줍니다.

프로젝트 세팅스를 열어 Engine>Collision탭에서 Object Channels> New Object Channel을 클릭해 새채널을 추가합니다.

이름을 Player Default reference를 Ignore로 합니다.

 Enemy와  Bullet도 Ignore로 추가해주겠습니다.

콜리전 설정하기

BP_Bullet를 열어 BoxCollision을 선택한후 디테일에서 Collision Presets를 Custom으로 변경하고 Object Type을 Bullet로 선택합니다. 혹시 Bullet가 안보이면 컴파일후 다시 시도 합니다. Collision Enable은 지금은 안필요하지만 나중에 물리적 처리를 할지도 모르므로  Collision Enabled로 변경합니다.  Object Resoponses는 Enemy를 제외하고 Ignore로 합니다.

Collision Preset만들기

굳이 커스텀으로 설정하지 않고우리가 설정한 내용을 프리셋으로 저장해놓고 필요할 때마다 가져올수도 있습니다. 오브젝트 채널을 추가할 때 열었던 프로젝트 설정창을 열고  Collision탭에서 Presets항목을 펼치고 New버튼을 클릭하면 Object Responses를 설정하고 추가해서 저장할 수 있습니다.

Bullet, Player, Enemy 차례로 다음과 같이 설정합니다.

Bullet / Player / Enemy Collision 설정

충돌 이벤트 구현하기

언리얼에서 충돌이 발생하면 Overlap Event가 발생하고 OtherActor에 해당 Actor가 반환됩니다. 우리가 필요한 Actor로 Cast해서 사용해야 합니다.

BP_Bullet 블루프린트를 열고 Event ActorBeginOverlap의 OtherActor핀을 끌어 Enemy를 검색해서 Cast To BP_Enemy 함수 노드를 선택합니다.

Cast To BP_Enemy는 충돌한 Actor가 BP_Enemy일 경우 As BP Enemy핀으로 정보를 반환하고 아닐경우 Cast Failed를 실햅합니다. BP_Enemy의 경우 총알에 부딪친 적을 파괴하기 위해 DestroyActor를 연결해 줍니다.

파괴후 총알 자신도 없어져야 하므로 Destroy Actor를 하나더 추가해줍니다. 여기서 조심해야할점은 자신이 맨 마지막에 파괴되어야 합니다.

플레이 해보면 총알을 맞은 적이 사라지지만 좀 심심합니다. 폭발 효과를 넣어보겠습니다. 마지막 DestroyActor를 잠시 끊고 사이에 Spawn Emitter At Location을 추가하겠습니다. Emitter Template로는 StarterContents의 P_Explosion을 선택해줍니다. Location은 총알의 위치로 하기 위해 GetActorLocation을 연결해주고 다음과 같이 마지막에 Destroy Actor를 연결해줍니다.

이제 BP_Enemy 블루프린트에서도 충돌기능을 구현합니다. Bullet의 충돌 구현 이벤트 그래프를 복사해서 붙여 넣습니다. 

Cast To BP_Enemy를 Cast To BP_Player로 교체해 줍니다.

플레이 하다보면 가끔 에러가 발생하는데 Player가 제거 되었는데 적이 Player로 향하려고 하는데 정보가 없기 때문입니다. 따라서 정보를 얻기 전에  Player가 Valid한지 체크하는 노드를 추가합니다.

킬존 제작하기

총알과 적은 무한대로 만들어지고 화면 밖으로 나가지만 실제 아웃라이너를 보면 아직도 살아있고 결국 메모리를 다 채웁니다. 따라서 화면 밖으로 나간 Actor들은 지워줄 필요가 있습니다.

BP_KillZone이라는 이름으로 액터 블루프린트를 생성합니다. Components +Add에서 BoxCollision을 추가하고 DefaultSceneRoot와 위치를 바꿔 Root로 바꿔줍니다.

프로젝트세팅 Collision 탭의 Object Channes에 Killzone을 Overlap으로 설정해서 추가해 줍니다.

BP_KillZone으로 돌아와 컴파일후 BoxCollision의 디테일창에서 다음과 같이 설정합니다. Player는 사라지면 안되므로 Ignore해줍니다. KillZone도 여러방향 배치해서 겹쳐서 사라질수 있으므로 Ignore로 해줍니다. 컴파일 세이브 해줍니다.

Component BoxCollision Detail창의 Shape Extent의 값을 다음과 같이 하여 길게 만듭니다.

이벤트그래프 탭을 선택 다음과 같이 Destroy Actor 노드를 추가하면 충돌된 모든 Actor들이 사라집니다.

BP_KillZone 블루프린트 클래스를 끌어다 뷰포트에 놓고 위치를 리셋한후 다음과 같이 Z는 1500 하나도 추가하던지 복사해서 아래는 -1500으로 설정합니다.

위아래 긴 바가 생깁니다.

플레이후 플레이어가 DeadZoen에 닫아 죽는다면 BP_Player를 열고 컴포넌트의 Cube의 디테일을 보면 Collision이 있습니다. Collision Presets를 NoCollision으로 비활성화 해줍니다.

레벨 아웃라이너에 액터들이 늘어나 복잡합니다. 폴더를 만들어 정리해 줍니다.

'언리얼엔진 > 블루프린트슈팅게임만들기' 카테고리의 다른 글

적 Enemy 만들기  (0) 2023.10.09
총알 만들기  (0) 2023.10.09
Player만들기  (0) 2023.10.08
프로젝트 만들기  (0) 2023.10.08