콜리전 타입
언리얼 엔진의 콜리전은 Unity와 비슷하지만, 몇 가지 차이가 있는데 그 부분을 여기서 살펴보겠습니다. Unity의 레이어 기반 콜리전 탐지를 사용해 봤다면, 프로젝트 콜리전 세팅은 콜리전 매트릭스와 비슷하게 보일 것입니다. 편집(Edit) > 프로젝트 세팅(Project Settings) > 콜리전(Collision)으로 이동하여 여기에 액세스할 수 있습니다. 프리셋(Preset) 탭을 펼치면 모든 디폴트 프리셋 프로파일과 해당 프로파일의 기능에 대한 설명을 볼 수 있습니다.
언리얼에는 콜리전 처리와 관련하여 몇 가지 옵션이 더 있다는 것을 알 수 있습니다. 이에 대한 내용은 언리얼 엔진 콜리전 개요에서 자세히 다룹니다. 이와 같이 세분화된 콜리전 탐지 기능은 게임 퍼포먼스 향상에 도움이 될 수 있다는 점에서 유용합니다. 다음 내용을 알아 두면 도움이 될 것입니다.
채널 또는 개별 콜라이더를 블로킹(Blocking), 오버랩(Overlap) 또는 무시(Ignore)로 설정할 수 있습니다.
흔히들 콜라이더에서 해당 이벤트가 필요한 경우에도 오버랩 이벤트 생성(Generate Overlap Events) 체크박스를 제대로 설정하지 않는 실수를 많이 합니다.
스태틱 지오메트리는 블로킹 및 오버랩 설정되어야 하지만, 게임플레이에 필요하지 않으므로 오버랩 또는 히트 이벤트를 꼭 생성할 필요는 없습니다.
특히 고속으로 이동할 때, 오브젝트가 다른 오브젝트를 블록하는 경우에도 오버랩 이벤트가 생성될 수 있습니다. Unity에서는 리지드 바디 컴포넌트 대신 이동을 직접 수정하는 경우 이것이 문제가 될 수 있습니다. 피직스 고려 사항을 우회하게 되기 때문입니다.
언리얼에서는 액터의 트랜스폼을 업데이트하는 함수를 호출할 때, 액터의 이동 방식을 지정하는 두 개의 부울 파라미터가 있습니다.
스윕(Sweep)을 true로 설정하면 오버랩이 트리거되고, 블록된 경우 해당 액터가 대상에 도달하기 전에 멈추게 합니다. 텔레포트(Teleport)는 피직스 속도를 유지할지 여부를 결정합니다.
채널은 Unity의 피직스 캐스트(예: Raycast, SphereCast 등)에 해당하는 트레이스에도 사용할 수 있습니다. Unity의 Raycast에서 레이어 마스크를 전달할 때와 같은 방식으로 라인 트레이스 함수 호출 중에 이 채널을 전달할 수 있습니다.
패럿 커스텀 콜리전 타입
패럿에는 Player, Cannonball 및 Enemy 같은 몇 가지 커스텀 콜리전 오브젝트 채널이 구성되어 있습니다.
이러한 오브젝트 타입을 추가함으로써 패럿은 월드에서 콜리전 트레이스가 발생할 때 이러한 오브젝트 채널이 트레이스 채널과 상호작용하는 방식을 정확하게 제어할 수 있습니다. 일반적으로 발생해야 하는 상황에 대한 디폴트 반응이 설정되어 있지만, 원하는 대로 커스터마이징할 수 있습니다. 패럿에는 Player, OverlapAllPlayers, BlockAllPlayers, Cannonball, Enemy 같은 몇 가지 커스텀 트레이스 채널 프리셋도 있습니다.
이러한 프리셋은 게임플레이 트리거에 특히 유용합니다. 예를 들어, OverlapAllPlayers는 다른 모든 콜리전은 무시하고 플레이어 콜리전 오브젝트 타입이 있는 콜리전 이벤트에만 반응할 수 있습니다. 게임 내 다양한 메시의 콜리전 세팅을 살펴보면 이러한 프리셋이 자주 사용되는 것을 볼 수 있습니다.
또한 콜리전 세팅은 필요한 경우 메시 단위로 커스터마이징할 수도 있습니다.
월드 바운드
레벨 생성 시 월드 바운드(World Bounds)에 유의해야 합니다. 월드 바운드는 월드 세팅(World Settings) > 월드(World)에서 설정할 수 있습니다. 액터가 이러한 정의된 월드 바운드와 상호작용할 때 커스텀 대미지 타입을 구현할 수 있습니다. 패럿 바운드는 킬 Z(KillZ) 월드 세팅과 아웃 오브 바운드(Out of Bounds) 트리거 볼륨을 조합하여 사용합니다.
트리거 볼륨
언리얼 엔진에는 이벤트 트리거에 사용할 수 있는 트리거 볼륨 액터(언리얼 엔진의 트리거 볼륨 액터 참조)가 내장되어 있습니다. 개발자가 패럿에서 이러한 액터를 사용하는 예시로는 아웃 오브 바운드(Out Of Bounds) 및 결승선(Finish Line) 트리거 볼륨이 있습니다. 트리거 볼륨은 레벨 블루프린트와 함께 사용되는 경우가 많지만(패럿의 레벨 블루프린트 개발자 문서 참조), 꼭 함께 사용해야 하는 것은 아닙니다. 패럿의 아웃 오브 바운드(Out Of Bounds) 트리거는 간단한 이벤트 그래프가 있는 박스 트리거입니다.
디테일 패널에서 액터의 콜리전 세팅을 보면 콜리전 채널 프리셋이 여기서 대부분의 작업을 수행하고 있음을 확인할 수 있습니다.
파워 픽업
패럿의 파워업 픽업 구현을 통해 콜리전 시스템의 실제 예시를 살펴보겠습니다. Content > Blueprints > Pickups에서 BP_PickupBase를 열고 뷰포트를 보면 콜리전 컴포넌트가 포함된 계층구조를 확인할 수 있습니다.
콜리전 세팅과 아웃 오브 바운드에는 플레이어와 오버랩 이벤트를 생성하는 트리거 프리셋이 있습니다.
이벤트 그래프를 보면 Other Actor를 파라미터로 사용하는 ActorBeginOverlap 이벤트가 있습니다. 이 이벤트는 Unity의 OnCollisionEnter와 매우 비슷하게 작동합니다. 여기서 차이점은 콜라이더 컴포넌트가 전달되는 대신 액터 자체가 주어진다는 점입니다.
패럿은 캐스팅을 통해 이 액터가 오버랩된 플레이어인지 확인합니다. 그런 다음, OnPickedUp 이벤트를 호출합니다. 이러한 방식 덕분에 파생된 블루프린트 클래스는 OnPickedUp에 대한 자체 행동을 정의할 수 있는 한편 베이스 클래스는 액터 오버랩 이벤트 자체를 처리할 수 있습니다.
개발자는 베이스 블루프린트를 사용하여 모든 픽업이 사운드를 재생하고 일부 파티클 이펙트를 스폰하도록 처리합니다. 픽업 사운드 및 파티클 이펙트 변수는 인스턴스 편집이 가능하므로 파생된 클래스의 클래스 디폴트에서 설정할 수 있습니다. 클래스 디폴트(Class Defaults)는 블루프린트 에디터 상단의 컴파일 버튼 옆에 있습니다.
변경된 클래스 디폴트의 예시로는 녹색 파티클의 나이아가라 시스템을 사용하는 속도 픽업이 있습니다. 반면에 하트 픽업은 분홍색 파티클을 사용합니다. 마찬가지로, 픽업 메시 자체도 파생된 블루프린트에서 설정할 수 있습니다. 오버랩 로직의 마지막 단계는 픽업 액터를 소멸하는 것입니다. 왜냐하면 플레이어가 수집한 후에도 계속 남아 있으면 안 되기 때문입니다.
몇 개의 노드만 있으면 파생된 블루프린트로 쉽게 확장할 수 있는 강력한 로직을 만들 수 있습니다. 파생된 모든 블루프린트는 액터에 연결된 오버랩 이벤트에서 비롯됩니다.
적 위로 점프하는 플레이어 캐릭터
살펴볼 만한 또 다른 좋은 예시는 적 위로 점프하는 플레이어입니다. 적의 캡슐 콜라이더 타입은 'enemy'이며 플레이어 오브젝트 타입과 충돌합니다. 검을 든 적에게도 비슷한 오버랩 이벤트가 있습니다. 이러한 영역을 일반적으로 히트박스라고 하며 공격이 유효한 영역입니다.
하지만 플레이어가 적 위로 점프할 때 패럿에서는 어떻게 이걸 처리할까요? 해결책은 적의 머리에 허트박스를 배치하는 것이었습니다. 플레이어가 이 허트박스 볼륨과 오버랩되면 플레이어 캐릭터는 일련의 확인을 통해 캐릭터의 위치와 허트박스의 위치, 허트박스 범위에 따라 유효한 점프인지 검사합니다. 검사에 통과하면 플레이어는 점프를 수행하여 적을 히트할 수 있습니다. 어려운 부분은 다시 한번 콜리전 채널이 처리하는데, 콜리전 채널은 패럿에서 중요하게 여기는 오버랩, 즉 허트박스 볼륨에서 플레이어 콜리전 오브젝트와 적의 오버랩만을 필터링하여 처리합니다.