충돌체 제작 방법
충돌체를 설정하는 방법은 총 3가지가 있으며 아래와 같다
추가적으로, 하나의 액터에는 아래의 세 가지의 충돌체를 모두 설정할 수도 있다
- Primitive Component
일반적인 경우에는 루트 컴포넌트로 설정되는
프리미티브 컴포넌트(캡슐, 박스, …)가 충돌체 역할을 한다
- StaticMesh Component
스태틱메시 에셋을 그대로 충돌체로 사용하는 방법으로
스태틱메시를 더블클릭하면 열리는 스태틱메시 에디터에서
해당 충돌체 영역을 설정하고 확인할 수 있다
스태틱메시 에셋에 콜리전을 넣으면, 비주얼과 충돌 기능을 모두 설정할 수 있다
- Physics Asset
일반적으로 캐릭터의 이동은 캡슐 컴포넌트를 사용해서 처리한다
하지만 특정 상황에서 캐릭터의 각 관절 효과가 적용되는
RagDoll 효과를 적용할 때 사용된다
각 부위에 기본 도형으로 충돌체를 설정하고 이를 연결해서 캐릭터의 충돌체를 설정한다
피직스 에셋은 스켈레탈 메시에만 사용이 가능하다
충돌 설정 3가지 (Collision Preset, Collision Profile)
스태틱메시 애셋에는 BlockAll이라는 기본 설정이 되어있기에
캐릭터 이동을 방해하는 레벨 컨텐츠를 그냥 제작하면 된다
하지만 플레이어가 레벨에 배치된 액터들과 올바른 상호작용을 하기 위해서는
아래와 같은 3가지 설정을 해주어야 한다
1. Collision Enabled (해당 충돌체가 어떤 종류의 반응을 할 수 있는지)
2. Object Type (충돌체 분류)
3. Collision Responses (다른 충돌체와 어떻게 반응할 것인지)
위의 3가지를 Collision Preset 혹은 Collision Profile이라고 한다
콜리전 프리셋 확인 방법
Details > SkeletalMeshComponent, CapsuleComponent에서
Collision > Collision Presets을 통해 확인 가능하다
Generate Hit Events, Generate Overlap Events는
다른 충돌체와 Hit, Overlap이 발생하면 관련 델리게이트에 바인드 된 함수 호출 여부를 설정할 수 있다
Collision Enabled
해당 충돌체가 어떤 반응할 수 있는지를 설정하는 부분이다
액터마다 자신에게 적절한 충돌체 반응을 지정하는 것이
성능 상의 부하를 줄일 수 있다
- Query Only
두 충돌체가 서로 겹칠 때 신호만 보낸다
충돌체의 겹침을 감지하는 것을 언리얼에서 오버랩(Overlap)이라 한다
충돌체가 겹치면 해당 컴포넌트들의 BeginOverlap 델리게이트에 바인드된 함수가 호출된다
지정한 선 상에 물체가 충돌되었는지 탐지하는 LineTrace나 Sweep도 Query에 속한다
- Physics Only
두 충돌체가 서로 겹칠 때 물리적으로만 반응한다
즉, 서로 밀어내거나 제한을 주는 반응이 가능하다
- Query and Physics
두 충돌체가 서로 겹칠 때, 물리적 반응과 신호 둘 다 사용하는 경우이다
해당 설정을 통해 모든 액터에 해놓게 된다면
물리 엔진이 수행해야 할 계산량이 증가된다
Object Type의 대분류
- 오브젝트 채널
충돌이 발생했을 때 특정 개체를 식별하기 위한 채널이다
즉, 개체에 딱 붙어있는 충돌체 종류이다
ex. WorldStatic / WorldDynamic / Pawn / PhyscisBody / …
- 트레이스 채널
특정 경로를 따라서 충돌을 감지하는 채널이다
ex. Visibility / Camera
Object Type의 소분류
WorldStatic
움직이지 않는 정적인 배경 액터에 부착된 충돌체(컴포넌트)에게 부여된다
주로 스태틱메시 컴포넌트를 가진 액터에게 부여된다
WorldDynamic
움직이는 액터에게 사용하는 콜리전 채널이다
Pawn
플레이어가 조종하는 폰 액터에 주로 사용한다
캐릭터의 충돌을 담당하는 캡슐 컴포넌트에게 부여된다
PhysicsBody
물리 시뮬레이션으로 움직이는 컴포넌트에 부여된다
Visibility
배경 액터가 시각적으로 보이는지 탐지하는 데 사용된다
탐지에서 폰은 제외된다
마우스로 물체를 선택하는 피킹 기능을 구현할 때도 사용된다
Camera
카메라 설정을 위해 카메라와 목표물 간에 장애물이 있는지 탐지하는데 사용된다
DoCollisionTest 속성과 관련된 콜리전 채널이다
Collision Responses
해당 컴포넌트에 설정된 콜리전 채널이 상대방 컴포넌트의 콜리전 채널과
어떻게 반응할지 지정하는 작업으로 세 가지로 종류가 있다
일반적으로 Pawn의 경우에는 거의 모든 채널과 Block 반응을 한다
- 무시(Ignore)
충돌이 있어도 아무 반응이 일어나지 않는다
뚫고 지나간다
- 겹침(Overlap)
무시와 동일하게 물체가 뚫고 지나갈 수 있지만,
이벤트가 발생한다
- 막힘(Block)
충돌체가 뚫고 지나가지 못하도록 막는다
Collision Responses의 우선순위
언리얼은 Ignore > Overlap > Block 순으로 우선시해서 성능을 고려한다
따라서, 서로 Collision Responses를 다르게 작성하는 경우에는
위의 우선순위에 따라 설정된다
예를 들어,
A 컴포넌트의 콜리전 채널은 B 컴포넌트의 콜리전 채널에 대해 Ignore
B 컴포넌트의 콜리전 채널은 A 컴포넌트의 콜리전 채널에 대해 Block인 경우에는
둘 다 Ignore로 설정된다
Overlap 이벤트와 Hit 이벤트
Generates Overlap Events 속성이 체크되어 있고,
두 컴포넌트가 서로 Overlap 상태라면,
BeginOverlap 이벤트와 EndOverlap 이벤트가 발생한다
Generates Hit Events 속성이 체크되어 있고,
두 컴포넌트가 서로 Block 반응이라면
Hit 이벤트가 발생한다
새로운 콜리전 채널 추가
Toolbar > Project Settings > Collision에서
Object Channels > Add Object Channel를 통해 추가 가능하다
새로운 콜리전 프리셋 추가
Preset > New를 통해 추가 가능하다
콜리전 프리셋 설정
Editor의 Details에서 직접 설정할 수 있고
C++로 하드 코딩을 하는 방법은 아래와 같다
// SCharacter.cpp
...
ASCharacter::ASCharacter()
{
...
GetCapsuleComponent()->InitCapsuleSize(CharacterRadius, CharacterHalfHeight);
GetCapsuleComponent()->SetCollisionProfileName(TEXT("SCharacter"));
...
}
콜리전 채널의 Enum 값 매핑
프로젝트 폴더 > Config > DefaultEngine.ini 파일을 메모장으로 열어
콜리전 채널을 Enum 값을 확인할 수 있다
위의 사진에서는 SCharacter가 ECC_GameTraceChannel1에 매핑됨을 확인할 수 있다
언리얼은 게임에서 활용할 수 있도록 총 32개의 콜리전 채널을 제공한다
32개 중 8개는 언리얼이 기본으로 사용하고, 6개는 다른 용도로 예약되어 있다
따라서, 남은 18개만 사용 가능하다
즉, 게임 프로젝트에서 새로 생성하는 콜리전 채널과 트레이스 채널은
ECC_GameTraceChannel1부터 18번까지 중 하나를 배정받는다
추가적으로, C++ 코드에서 이 값을 이용해서 특정 채널 간의 콜리전 반응을 수정할 수도 있다
'게임 엔진 > [코드조선] 언리얼' 카테고리의 다른 글
언리얼 Collision - Draw Debug (+ Console Command) (0) | 2024.05.15 |
---|---|
언리얼 Collision - 충돌 감지 (0) | 2024.05.15 |
언리얼 Animation - Animation Notify (0) | 2024.05.14 |
언리얼 Animation - Animation Montage (0) | 2024.05.14 |
언리얼 Animation - State Machine (0) | 2024.05.14 |