UE 4.27
- 언리얼에서 Trace (트레이스)는 레벨을 뻗어나가며 직선상에 무엇이 존재하는지 확인할 수 있는 메서드를 제공합니다. 두 (시작과 끝 위치) 지점을 제공해 주면, 피직스 스시템에서 그 두 점에 직선을 그으며 거기에 (콜리전으로) 걸리는 액터가 있는지 보고해 주는 식으로 사용합니다. 트레이스는 본질적으로 다른 소프트웨어의 Raycast (레이 캐스트) 또는 Raytrace (레이 트레이스)와 같습니다.
콜리전(Collision) 개요
보다 자세한 내용은 공식 문서에 있습니다.
- 콜리전 개요
- 콜리전 반응 레퍼런스
- 단순 vs 복합 콜리전
- UE-4.27.2 환경에서, 머티리얼 오버라이드의 경우, 레이 캐스트할 때, 컴플렉스 콜리전의 경우 적용되지 않습니다. 머티리얼 오버라이드의 경우, 심플 콜리전에 대해서만 작동하는 것으로 보입니다. 확인이 필요합니다. 또한 머티리얼에 피직스 머티리얼을 이용하는 경우, 이를 가져오기 위해서는 컴플렉스 레이 캐스트를 이용해야 가져올 수 있습니다. 현재 생각은 이름에 오해의 소지가 있고, 레이 캐스트가 컴플렉스에 따라 다른 성격을 고려했을 때, 콜리전 타입에 있는 피직스 머티리얼에 접근하는 것과, 폴리곤에 있는 피직스 머티리얼에 접근하는 것으로, 명확한 것으로 생각됩니다. 코드에서 확인이 필요합니다.
콜리전이란
콜리전은 물리적 충돌 영역을 의미합니다. 콜리전은 Collision Responses 및 Trace Responses 등에 사용됩니다.
- 콜리전 설정을 통해, 충돌, 오버랩, 또는 오브젝트는 서로 막을지 겹칠지, 아니면 무시할지 영향을 주고받을지 설정할 수 있습니다.
-
트레이스 반응 작동방식도 기본적으로 비슷합니다. 다만 트레이스(레이 케스트) 자체를 하나의 트레이스 반응 유형으로 설정하여 사용합니다.
- Ignore는 콜리전이 있어도 아무 충돌도 일어나지 않습니다.
- Overlap은 무시와 동일하게 물체가 뚫고 지나갈 수 있지만 이벤트를 발생시킵니다.
- Block은 물체가 뚤고 지나가지 못하도록 막습니다.
콜리전의 활용
- RagDoll효과를 구현할 때는 피직스 애셋을 이용합니다.
- 캐릭터의 각 부위에 기본 도형으로 충돌 영역을 설정하고 이를 연결해 캐릭터의 물리를 설정합니다. 피직스 애셋은 스켈레탈 메시에만 사용할 수 있습니다.
- 스태틱메시 에셋에 콜리전 영역을 생성하여 사용할 수 있습니다.
- 기본 도형(Primitive) 컴포넌트를 이용해 스태틱 메시와 별도로 충돌 영역을 지정합니다.
- 스켈레텔 메시를 움직일 때 주로 이용합니다.
콜리전 처리방식에 있어 유념해야 할 규칙
콜리전 처리 방식에 있어 유념해야 할 규칙들이 있습니다.
- Blocking은 막음으로 설정된 두 액터 사이에 자연적으로 발생합니다.
- Simulation Generates Hit Events 옵션을 켜줘야 Event Hit을 실행하며, 이는 블루프린트, 디스트럭터블 액터, 트리거 등에서 사용됩니다.
- 액터를 Overlap으로 설정하면 서로 Ignore하는 것처럼 보입니다.
- Generate Overlap Events옵션이 없으면 기본적으로 같습니다.
- 둘 이상의 시뮬레이션 오브젝트가 서로를 막도록 하려면, 그 각각의 유형에 대해 막음 설정되어 있어야 합니다.
- 둘 이상의 시뮬레이션 오브젝트에 대해, 하나가 오브젝트가 겹침 설정되어 있고, 두 번째 오브젝트가 다른 것을 막음 설정되어 있는 경우 겹칩은 발생하나 막음은 발생하지 않습니다.
- 오버랩 이벤트는 한 오브젝트가 다른 것을 막는 경우에도 발생 가능합니다. 특히나 고속 이동인 경우인 경우 좋습니다.
- 한 오브젝트가 충돌 및 겹침 이벤트를 둘 다 갖는 것은 좋지 않습니다. 가능은 하지만 수동 처리가 필요한 부분이 많습니다.
-
한 오브젝트가 무시 설정되어 있고, 다른 것은 겹침 설정된 경우, 겹침 이벤트는 발생하지 않습니다.
- Hit이벤트는 닿기만 하면 계속해서 호출됩니다. 스팸이 발생하므로, 충돌 대상 필터링에 주의를 기울이는 것이 좋습니다.
- 어떤 의도와 목적이든 간에, Generate Overlap Events 옵션이 꺼졌다면, Overlap과 Ignore는 똑같습니다.
- 오버랩 이벤트는 ReceiveBeginOverlap과 ReceiveEndOverlap으로 나뉘어 있어서, 각각의 경우에만 발동합니다.
물체의 콜리전 반응
콜리전은 반응을 최소화 시키도록 만들어져 있습니다. Ignore, Overlap, Blocking순으로 제약 레벨이 있다면, 두 오브젝트의 가장 작은 제약 레벨이 콜리전 반응이 됩니다.
두 오브젝트의 콜리전 반응에 따라 콜리전 이벤트를 호출합니다. 콜리전 반응이 오버랩이면, 설정과 상관없이 두 오브젝트 모두 오버랩 이벤트를 발생시킵니다.
콜리전 이벤트의 호출은 해당 오브젝트의 콜리전 세팅의 콜리전 이벤트 설정들 (Simulation Generated Hit Events, Generate Overlap Events)에 따라 결정됩니다.
콜리전 반응 래퍼런스
Collision Properties카테고리의 Collision Presets/Collision Response 섹션에는 프로퍼티와 세팅이 있습니다.
에디터에서 툴팁 택스쳐로 볼 수 있습니다.
기본 콜리전 프리셋
기본 콜리전 프로파일과 프로젝트(세팅 -> 엔진 -> 콜리전 -> 프리셋)에 만들어 둔 것이 나타납니다.
- Static은 움직이지 않는 정적인 배경 액터에 사용하는 콜리전 채널입니다.
- 주로 스태틱메시 액터에 있는 스태틱메시 컴포넌트에 사용합니다.
- **Dynamic은 움직이는 액터에 사용하는 콜리전 채널입니다. **
- 블루프린트에 속한 스태틱메시 컴포넌트에 사용합니다.
- Pawn은 플레이어가 조종하는 물체에 주로 사용합니다.
- 캐릭터의 충돌을 담당하는 캡슐 컴포넌트에 설정됩니다.
-
PhysicsBody은 물리 시뮬레이션으로 움직이는 컴포넌트에 설정합니다.
- Default는 스태틱 메시 에디터에서 스태틱 메시에 적용된 세팅을 사용합니다.
- Custom…은 인스턴스에 대한 모든 커스텀 콜리전 세팅을 설정합니다.
- NoCollision은 충돌이 없습니다.
- BlockAll은 기본적으로 모든 액터를 막는 WorldStatic은 오브젝트입니다. 모든 새 커스텀 채널은 자체적인 기본 반응을 사용합니다.
- OverlapAll은 기본적으로 모든 액터에 겹치는 WorldStatic오브젝트입니다. 모든 새 커스텀 채널은 자체적인 기본 반응을 사용합니다.
- BlockAllDynamic은 기본적으로 모든 액터를 막는 WorldDynamic오브젝트입니다. 모든 새 커스텀 채널은 자체적인 기본 반응을 사용합니다.
- OverlapAllDynamic은 모든 액터에 기본적으로 겹치는 WorldDynamic오브젝트입니다. 모든 새 커스텀 채널은 자체적인 기본 반응을 사용합니다.
- IgnoreOnlyPawn은 폰과 비히클을 무시하는 WorldDynamic오브젝트입니다. 다른 모든 채널은 기본으로 설정됩니다.
- OverlapOnlyPawn은 폰, 카메라, 비히클에 겹치는 WorldDynamic 오브젝트입니다. 다른 모든 채널은 기본으로 설정됩니다.
- Pawn은 폰 오브젝트입니다. 플레이가능 캐릭터나 AI 의 캡슐로 사용할 수 있습니다.
- Spectator은 WorldStatic 제외 다른 모든 액터를 무시하는 폰 오브젝트입니다.
- CharacterMesh은 캐릭터 메시에 사용되는 폰 오브젝트입니다. 다른 모든 채널은 기본으로 설정됩니다.
- PhysicsActor는 시뮬레이팅되는 액터입니다.
- Destructible은 파괴가능 액터입니다.
- InvisibleWall은 보이지 않는 WorldStatic 오브젝트입니다.
- InvisibleWallDynamic은 보이지 않는 WorldDynamic 오브젝트입니다.
- Trigger는 트리거에 사용되는 WorldDynamic 오브젝트입니다. 다른 모든 채널은 기본으로 설정됩니다.
- Ragdoll은 시뮬레이팅되는 스켈레탈 메시 컴포넌트입니다. 다른 모든 채널은 기본으로 설정됩니다.
- Vehicle은 Vehicle, WorldStatic, WorldDynamic 을 막는 비히클 오브젝트입니다. 다른 모든 채널은 기본으로 설정됩니다.
- UI는 본으로 모든 액터에 겹치는 WorldStatic 오브젝트입니다. 모든 새 커스텀 채널은 자체적인 기본 반응을 사용합니다.
Collision Enabled
- Query는 두 물체의 충돌 영역이 서로 겹치는지 테스트하는 설정입니다. 충돌 영역의 겹침을 감지하는 것을 오버랩이라고 부르며, 퉁돌 영역이 겹치면 관련 컴포넌트에 BeginOverlap 이벤트를 발생시킵니다. 지정한 영역에 물체가 충돌하는지 탐지하는 레이캐스트나 스윕 기능도 Query에 속합니다.
- Physics는 물리적인 시뮬레이션을 사용할 때 설정합니다.
-
Query and Physics는 위의 두 기능을 모두 사용하는 설정입니다.
- No Collision은 물리 엔진 내 어떠한 표현이 없습니다. 공간 쿼리(레이캐스트, 스윕, 오버랩) 또는 시뮬레이션(리짓 바디, 컨스트레인트)에 사용할 수 없습니다. 이 세팅은 특히나 움직이는 오브젝트에 최적의 퍼포먼스를 냅니다.
- Query Only은 공간 쿼리(레이캐스트, 스윕, 오버랩)에만 사용됩니다. 시뮬레이션(리짓 바디, 컨스트레인트)에는 사용할 수 없습니다. 이 세팅은 물리 시뮬레이션이 필요치 않은 오브젝트와 캐릭터 동작에 좋습니다. 물리 시뮬레이션 트리 내 데이터를 감소시키는 것으로 퍼포먼스를 약간 개선시킬 수 있습니다.
- Physics Only은 물리 시뮬레이션(리짓 바디, 컨스트레인트)에만 사용됩니다. 공간 쿼리(레이캐스트, 스윕, 오버랩)에 사용할 수 없습니다. 이 세팅은 본 단위의 감지가 필요치는 않은 캐릭터의 이차 시뮬레이션 동작에 좋습니다. 쿼리 트리의 데이터를 감소시키는 것으로 퍼포먼스를 약간 개선시킬 수 있습니다.
- Collision Enabled은 공간 쿼리(레이캐스트, 스윕, 오버랩)과 시뮬레이션(리짓 바디, 컨스트레인트)에도 사용할 수 있습니다.
Object Type
임의의 설정으로, 피직스 바디의 역할에 맞춰 설정해야 합니다.
- WorldStatic는 이동하지 않는 액터에 사용합니다. 스태틱 메시 액터가 WorldStatic 유형을 갖는 액터의 좋은 예입니다.
- WorldDynamic는 애니메이션 또는 코드(키네마틱)의 영향 하에 움직이는 액터 유형에 쓰입니다. 리프트나 문이 WorldDynamic 액터의 좋은 예입니다.
- Pawn 플레이어 제어 개체는 Pawn 유형이어야 합니다. 플레이어의 캐릭터가 폰 오브젝트 유형을 받는 좋은 예입니다.
- PhysicsBody 피직스 시뮬레이션으로 인해 움직이게 되는 액터입니다.
- Vehicle은 기본적으로 비히클은 이 유형을 받습니다.
- Destructible은 기본적으로 디스트럭터블 메시가 이 유형을 받습니다.
Collision Response
이 피직스 바디가 다른 모든 유형의 트레이스 & 오브젝트 유형과 어떻게 상호작용하는지를 결정합니다. 기억할 것은, 최종 결과를 정의하는 것은 양쪽 피직스 바디 사이의 상호작용이라, 양쪽 피직스 바디의 오브젝트 유형과 콜리전 반응이 중요합니다.
- Ignore은 다른 피직스 바디의 콜리전 반응과는 상관없이, 이 피직스 바디는 상호작용을 무시합니다.
- Overlap은 다른 피직스 바디가 이 피직스 바디의 오브젝트 유형을 겹침 또는 막음으로 설정된 경우, 오버랩 이벤트 발생이 가능합니다.
- Block은 다른 피직스 바디가 이 피직스 바디의 오브젝트 유형을 막음으로 설정된 경우, 히트 이벤트 발생이 가능합니다.
Trace Responses & Object Type
- Line Trace by Channel 등에서 사용됩니다.
- Visibility은 배경 물체가 시각적으로 보이는지 탐지하는데 사용합니다. 탐지에서 폰은 제외됩니다. 마우스로 물체를 선택하는
-
Camera은 카메라 설정을 위해 카메라와 목표물 간에 장애물이 있는지 탐지하는데 사용합니다.
- WorldStatic은 이 피직스 바디가 WorldStatic 피직스 바디 오브젝트 유형과 상호작용할 때 어떻게 반응할 것인지 입니다.
- WorldDynamic은 이 피직스 바디가 WorldDynamic 피직스 바디 오브젝트 유형과 상호작용할 때 어떻게 반응할 것인지 입니다.
- Pawn은 이 피직스 바디가 Pawnm 피직스 바디 오브젝트 유형과 상호작용할 때 어떻게 반응할 것인지 입니다.
- PhysicsBody은 이 피직스 바디가 PhysicsBody 피직스 바디 오브젝트 유형과 상호작용할 때 어떻게 반응할 것인지 입니다.
- Vehicle은 이 피직스 바디가 Vehicle 피직스 바디 오브젝트 유형과 상호작용할 때 어떻게 반응할 것인지 입니다.
- Destructible은 이 피직스 바디가 Destructible 피직스 바디 오브젝트 유형과 상호작용할 때 어떻게 반응할 것인지 입니다.
Collision Complexity
Simple Collision (단순 콜리전)은 박스, 구체, 캡슐, 컨벡스 헐과 같은 프리미티브를 말합니다. Complex Collision (복합 콜리전)은 주어진 오브젝트의 트라이메시 입니다. 기본적으로 언리얼 엔진 4 는 PhysX 안에서 단순 & 복합 모양 둘 다 만든 뒤, 사용자가 원하는 바에 따라 (복합 쿼리 대 단순 쿼리), 그에 맞는 모양을 사용합니다.
- Default는 단순 콜리전 요청이 단순 콜리전을, 복합 요청은 복합 콜리전을 사용하도록 하는 “기본” 동작입니다.
- UseSimpleAsComplex는 복합 쿼리 요청시에도 엔진은 단순 모양에 대한 쿼리를 계속, 기본적으로 트라이메시를 무시합니다. 트라이메시를 구을 필요가 없기에 메모리가 절약되고, 콜리전 지오메트리가 단순해 지면 퍼포먼스가 향상될 수도 있습니다.
- UseComplexAsSimple는 단순 쿼리 요청시에도 엔진은 복합 모양에 대한 쿼리를 계속, 기본적으로 단순 콜리전을 무시합니다. 이를 통해 물리 시뮬레이션 콜리전에 트라이메시를 사용할 수 있습니다. 참고로 UseComplexAsSimple 사용중인 경우 오브젝트 시뮬레이션은 불가능하나, 다른 시뮬레이션 (단순) 오브젝트와의 충돌은 가능합니다.
콘솔 명령어
- show COLLISION : 레벨에 사용중인 콜리전 모델 및 블로킹 볼륨 전부를 그립니다.
- stat Game : 여러가지 유형의 콜리전에 걸리는 다양한 통계를 표시합니다.
활용
스태틱 메시에서의 설정
콜리전 설정이 중요한 이유
Begin Overlap으로 Widget을 여는 공간이 있습니다. 플레이어아 공간에 들어가면 Widget이 스크린에 표시된다고 합니다, 여기서 월드에 있는 아이템 액터를 파괴하고 인벤토리에 저장한다고 합시다.
- 월드에 있는 아이템 액터가 파괴될 때,
- 플레이어가 겹치는 공간에 들어왔는지, 콜리전 설정을 제대로 하지 않으면…
- 아이템이 파괴될 때, EndOverlap 이벤트를 호출하게 됩니다.
플레이어가 겹치는지 검사할려면 플레이어만 겹치게 해야합니다. 즉, 어떤 것을 검사할지 정확하게 표현해야 합니다. Default Setting을 믿지 말고, 직접 확인하는 제대로 작동하는지 설정을 직접 보는 것이 좋습니다.
스태틱 메시에 콜리전 구성을 볼 수 있습니다.