무엇이 충돌하는지를 선택하는 것은 매우 중요하지만 까다로울 수 있으며, UE4 개발 도중 꽤 오래 논의를 거쳤던 문제입니다. 저희 시스템이 처음에는 약간 복잡해 보일 수는 있지만, 매우 강력하고 일관성이 있습니다. 그래서 어떻게 그 시스템에 도달하게 되었는지 약간의 배경을 알려드리고자 합니다. 콜리전에 대한 여러가지 반응, 채널을 사용하여 콜리전을 필터링하는 방법, 단순 / 복합 콜리전 지오메트리 사이의 차이점 개요에 대해 말씀드리도록 하겠습니다.
Block, Overlap, Ignore
무언가 충돌한다고 할 때 첫 번째로 알아둬야 하는 것은, 관통이 가능한지 아닌지를 선택해야 한다는 것입니다. 벽돌벽은 플레이어를 'Block', 막지만 트리거는 플레이어에 'Overlap', 겹쳐서 통과할 수 있도록 합니다. 두 상황 모두 이벤트가 생성되지만 (UE4 용어로 각각 'Hit' 와 'Overlap') 중요한 차이가 있습니다. 다른 오브젝트는 'Ignore', 콜리전을 무시할 수도 있으므로, 세 가지 반응 유형이 가능합니다.
트레이스 채널과 오브젝트 채널
콜리전 필터링의 핵심에서 다음으로 큰 문제는 "누가 선택하게 되나?" 입니다. 오브젝트가 충돌하려는 질의 유형을 결정할 것인지, 아니면 질의가 찾는 오브젝트 유형을 결정할 것인지 입니다. 각기 다른 상황에서 둘 다 말이 되기에, UE4 는 둘 다 지원합니다!
게임에 두 개의 'Trace Channel'(트레이스 채널)을 정의했다고 가정해 봅시다. 하나는 'Visibility' (표시여부), 하나는 'Weapon' (무기) 질의용으로요. Brick Wall (벽돌벽)은 둘 다 막도록, Shrub (관목)은 표시여부는 막지만 무기는 못막도록, Bulletproof Glass (방탄 유리)는 무기는 막지만 표시여부는 못막도록 설정합니다. 이러한 유형의 질의를 할 떄는 하나의 트레이스 채널을 사용합니다.
게임 코드에서 어떤 유형의 오브젝트 질의를 해야 하는지 알기 위해 이 부분을 바꿨다면, 게임에서는 이 모든 상황 처리를 위해 엄청난 수의 여러가지 유형이 필요했을 것입니다! 호출 코드 자체를 바꿔 다른 것이 망가지는 상황이 발생하는 대신, 나중에 콘텐츠에서의 '부분 해결'이 가능하기도 합니다.
순전히 오브젝트 유형에 따라 오브젝트 질의를 하고픈 상황도 있는데, 그럴 때 'Object Channel'(오브젝트 채널)을 사용합니다. 한 예로 폭발 상황에서, 일정한 반경 내 'Pawn' 또는 'PhysicsBody' 유형의 오브젝트를 빠르게 전부 찾고 싶습니다. 이러한 유형의 질의를 할 때는, 다수의 오브젝트 채널을 지정할 수 있습니다.
UE4 에는 '내장' 트레이스 채널(Visibility, Camera)과 오브젝트 채널(WorldStatic, WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible)이 있으며, 편집 -> 프로젝트 세팅 -> 콜리전 에서 자신만의 채널을 쉽게 추가할 수 있으나, 총 32 개 까지로 제한되어 있습니다.
이동하는 오브젝트 사이의 콜리전
이동하는 오브젝트 사이의 콜리전 처리를 하고자 할 때는 좀 더 복잡해 집니다. 조합이 여러가지 있을 수 있기 때문입니다. UE4 에서 각 오브젝트는 자신의 오브젝트 채널과, 다른 오브젝트 채널에 어떻게 반응하는지에 대한 목록을 압니다. 두 오브젝트가 교차할 때 서로 어떻게 반응하는지 살펴보고, 다음과 같이 Block 을 최소화하는 상호작용을 취합니다:
즉 다음 씬을 상상해 봅시다:
Player 가 앞으로 이동합니다. 먼저 Shrub 에 Overlap 하겠지요. Player 의 유형이 Pawn 이며, Shrub 은 거기에 Overlap 하기를 원합니다. Shrub 은 WorldStatic 유형이며, Player 는 그것을 Block 하기를 원합니다. 차트를 보면, 최종 결과는 Overlap 입니다! 비슷하게, Brick Wall 과 Player 모두 서로 Block 하기를 원하므로, Player 는 Shrub 을 통과하고 (Overlap 이벤트 생성) Brick Wall 에는 가로막힙니다 (Hit 이벤트 생성).
플레이어가 둘이고 하나는 '유령'으로 만들고 싶은 경우, Pawn 채널에 대한 반응을 Block 에서 Ignore 로 변경하면 다른 플레이어를 통과할 수 있습니다.
콜리전 프리셋
이 시스템으로 레벨의 어떤 오브젝트가 어느 것과 충돌할지 많은 제어가 가능하긴 해도, 실질적으로 대부분의 오브젝트는 일반적인 환경설정에 해당합니다. 편의를 위해 UE4 에는 '콜리전 프리셋' 시스템이 있습니다. 각 프리셋에는 오브젝트 유형과, 게임 내 각 트레이스 및 오브젝트 채널에 대한 반응이 들어있습니다. 레벨에서 오브젝트를 선택할 때, 간단한 드롭다운을 통해 프리셋을 선택할 수 있습니다:
UE4 에는 이러한 것이 여러개 (Invisible Wall, Physics Actor 등) 내장되어 있으며, 마찬가지로 프로젝트 세팅에서 자신만의 것을 만들 수 있습니다. 프리셋을 사용하고 싶지 않은 경우, 'Custom…' 을 사용하면 위에서 언급한 대로 모든 반응을 변경할 수 있습니다:
단순 / 복합 콜리전
마지막으로 이해해야 할 것은, UE4 의 각 오브젝트는 'simple'(단순) 및 'complex'(복합) 콜리전 표현 둘 다를 가질 수 있다는 것입니다. 복합 콜리전이란 실제 렌더링 지오메트리를 콜리전에 사용한다는 것을 가리킵니다. 웨폰 트레이스처럼 보이는 대로 정확히 쏠 수 있었으면 하는 경우에 가장 유용합니다. 그렇다고 항상 충돌을 원하지는 않을 것이기에, 각 메시는 구체, 박스, 캡슐, 컨벡스 헐 모음으로 구성되는 단순 콜리전 표현을 가질 수도 있습니다. 플레이어 이동을 예로 들면, 작은 디테일에 걸리는 것을 방지하기 위해 단순 지오메트리에 대한 충돌을 합니다.
에디터에는 플레이어가 충돌하는 월드를 볼 수 있도록 해주는 편리한 뷰 모드가 있습니다:
결론
UE4 의 콜리전 필터링은 이게 전부입니다! 저희가 해결하려는 문제를 이해하고 여러분의 게임에 활용하는 법을 알아보는 데 도움이 되었으면 합니다. 질문이나 코멘트가 있으신가요? 한글은 네이버 카페, 영문은 포럼 또는 @EpicJamesG 트위터를 통해 남겨주시기 바랍니다.
--
*첫 Block 콜리전 이후 검색을 중지시킬 수 있는데, 퍼포먼스 최적화에 좋습니다. 사정거리 1km 의 총을 1m 앞에 있는 벽돌 벽에 발사한 경우, 999 미터 작업이 생략되는 것입니다.