언리얼 기초 60 충돌체 설정 (1)

큐브 오브젝트

우리 레벨에 Cube를 하나 넣어서 이렇게 배치해보자. 참고로 게임 패드 아이콘이 있는 지점은 Default Pawn이 스펀(Spawn)되는 시작점이다.

플레이 해보면 큐브는 그대로 떠있다.

큐브를 선택 -> Physics 탭 -> Simulate Physics 체크 -> 플레이

큐브가 뚝떨어지고 바닥에 살짝 튀는 모습이 보인다.

큐브 선택 -> Physics 탭 -> Collision 항목 -> Collision Presets 옵션 Custom으로 변경 -> Collision Enabled 항목 Query Only (No Physics Collision) -> 플레이

큐브가 바닥을 뚫고 계속 떨어진다. (오브젝트가 계속 떨어지는 설정이라고 warning 메시지도 뜬다)

다시 원복시켜두자

Collision Enabled 항목 -> Physic Only (No Query Collision) 설정 -> 플레이

캐릭터 클래스

캐릭터 클래스형 블루프린트를 하나 만들고 TestCharacter라 이름짓자

블루프린트에 마네킹으로 메시 세팅 -> 로컬 위치 보정 -> Compile -> Save

이 블루프린트를 화면에 드래그인 해서 아래와 같이 설정 -> 플레이

캐릭터도 큐브처럼 바닥으로 떨어져서 멈춘다. 그런데 살짝 튀는 바운스 효과가 없다.

캐릭터 선택 -> Physics 탭 -> Collision 항목 -> 두개의 Collision Presets 옵션중 아래쪽 옵션 Pawn에서 Custom으로 변경 -> Collision Enabled 항목 -> Physic Only (No Query Collision) 설정

참고로 캐릭터의 경우 Physics 탭 -> Simulate Physics 체크 -> 플레이

큐브와 마네킹이 같은 Physic Only 설정인데 큐브는 통통 튀고 마네킹은 바닥 아래로 뚫고 들어간다

심지어 Simulate Physics 항목을 체크했는데도 바닥으로 떨어진다. 이거하면 보통은 안 떨어져야 정상

참고로 Physics 탭 -> Collision 항목에 두 개 보이던 Collision Preset중 처음 건 마네킹의 메시 컴포넌트에 적용되어 있는 충돌 설정이다.(차후 설명)

물리 엔진

월드상에 사물(Actor)이 주변 사물과 겹치거나 닿았을 경우, 또는 사물(Actor)이 힘을 받아 속력을 가질경우, 다시말해 액터가 외부로부터 힘이나 충격등 물리적 영향을 받았고, 그 반응에 대한 움직임이 필요할 경우 게임은(특히 3D게임은) 이 반응을 처리해주는 코어루틴을 가지며 이를 물리 엔진이라 한다.

언리얼에서 물리 엔진의 이름은 카오스 엔진(Chaos Engine)이다.

위 Cube가 Physics Only 세팅(또는 Physics and Query 세팅)이 되었을 때, 이 액터는 물리적 영향(힘이나 충격)을 받은 후 그에 대한 반응을 이 물리 엔진에게 맡긴다.

그래서 살짝 튀는것.

위에서 했던 설정 중 Simulate Physics 항목을 체크하는 부분은, 해당 액터에 이 카오스 엔진을 키는 옵션.

만약 큐브에 Simulate Physics 항목이 체크 해제 되어있고 Physics Only 세팅이 되있는 경우 큐브는 가만히 있는다.

중력도 외부 힘이고 큐브는 이를 처리할 물리 엔진이 없는 것.

이 상태로 큐브를 바닥에 반쯤 담궈놓고 플레이 하면 가만히 있는다. 겹침 상황에 반응 하기 위해 의지할 반응 코드도 없는 것.

캐릭터의 경우 통통 튀는건 부자연스럽다. 게다가 무기나 둔기로 거대한 충격을 받았을 때 빙글빙글 돌며 저 하늘로 날아갈 일도 없다 (게임은 다양하니 종류에 따라 있을 순 있다), 그냥 ‘윽’ 소리를 내며 뒤로 몇 발자국 걸어간 후 쓰러지는게 자연스러울 것이다.

따라서 언리얼 게임의 캐릭터 클래스는 외부의 물리적 영향에 대한 반응을 물리 엔진에 의존하지 않고 자체적으로 처리하는데 캐릭터 블루 프린트에 보이는 CharacterMovement 컴포넌트가 그것.

사용자 입력을 받아 이동해야 할때도 이 CharacterMovement가 처리한다.

액터가 기본적으로 물리엔진에 의존하는 것으로 보아. 그의 Child인 Character 클래스(화면 우측상단)는 이 부분을 Override하거나 비활성화 시켰을 것이다.

Physic 와 Query Only

위의 큐브와 마네킹에 조정해봤던 옵션중에 Block과 Overlap라는 단어가 보인다.

Overlap 마네킹 캐릭터는 경사에서 발의 높이를 계산하기 위해 스피어(Spear, 구체) 트레이싱을 했었다. 사물(Actor)이나 충돌체(스피어 같은)에서 겹침이 발생했을 때 필요한 로직을 호출하기만 하고 끝낸다. Query Only일때 Overlap 체크면 충분한 것.

Block 겹쳤을 때, 실제 움직임이나 형태에 영향을 주는 물리엔진에게 후속 조치를 맞긴다. Physic Only와 관련이 깊을 수 밖에 없다.

캐릭터 클래스의 경우 기반 시스템인 물리엔진에게 의지하기 위해 Physic Only를 쓰기보다 스스로 검사하고 스스로 움직이기에 Query Only만으로도 블럭효과가 있는것.

바닥은 충돌체 타입이 WorldDynamic이다. 우리가 조작한 캐릭터의 Collision 세팅에서 WorldDynamic에대해 하는 처리를 Overlap로 하면 캐릭터가 바닥을 뚫고 떨어진다.

생각같아선 캐릭터는 Query Only로 쿼리만 하면 되기 때문에 Overlap 체크만으로도 바닥에 서있을 수 있어야 할 것같다. 하지만 이 쿼리(Spatial Query, 공간 질의)를 다루는 캐릭터의 CharacterMovement 컴포넌트가 이를 구분해서 처리한다. Block일 경우 밀어내고, Overlap일 경우 “Hit” 없이 겹침 처리만 하는 것

캐릭터가 쿼리(Spactial Query)를 통해 충돌을 판단한다고 해도 대상이 Overlap체크인지 Block체크인지에 따라 차이가 있다

Leave a Comment