UE5

Physics Field System _ RPG 부서지는 물체

게임 개발 2023. 10. 16. 18:17

게임에서는 부서지는 물체와 부서지지 않는 물체가 구분된다.

이러한 사소한 물리 시스템의 적용이 플레이어의 몰입감을 높여준다.

 

붉은 사막 트레일러에서 이를 찾아볼 수 있다.

 

 

 

플레이어가 전투 중, 나무로 만든 구조체와 부딪히니,

박살이 나는 것을 확인할 수 있다.

 

이는 비단 나무 뿐만이 아닌,

항아리가 될 수도 있고,

혹은 이러한 물리 시스템을 이용해서

끊겨있는 다리를 대신 해 나무를 부셔서 다리 대용으로 이용하도록 플레이어를 유도하면

플레이어가 게임에서 느끼는 몰입감은 배가 될 것이다.

 

 

결국 플레이어가 얼마나 오랫동안 게임에 머무르느냐는

이러한 사소한 디테일에 따라 달린 것이라고 생각한다.

 

가상 세계에서 플레이어가 상상했던 그 이상의 디테일을 접할 기회를 자꾸 제공하면

플레이어는 해당 가상 세계에서의 몰입도가 높아지고 게임의 평가가 좋아질 가능성이 크다.

 

왜 이런 생각을 하게 되었냐면,

필자가 어린 시절 게임을 할 때 그랬다.

오픈월드 게임에서 하늘을 나는 게 그렇게 좋아서

왼종일 하늘만 날아다닌 적도 있다.

 

성인이 된 후에는 로아를 할 때는

필자는 RPG에 큰 흥미를 느끼지는 못하지만

던전을 돌 때 캐릭터가 외줄타기를 한다던가,

무심코 지나갈 수 있는 액터를 부순다던가 하는 디테일적 요소에 빠져들 수 밖에 없었다.

 

요즘 대작이라고 불리는

젤다에 전설에 사람들이 큰 관심을 가지는 이유도 이런 것 때문일 것이라고 생각한다.

 

언리얼에서는 이런 디테일을 적용할 수 있는 기능을 제공해준다.

 

이 기능을 사용하는 데 익숙해지면

몇 조각으로 액터를 쪼갤지, 해당 액터가 어느 방향으로 쪼갤지,

또한 방향에 따라 쓰이는 알고리즘도 다 다르다.

 

해당 게시물은 참고 문서는 아래와 같은 주소

https://docs.unrealengine.com/5.2/en-US/overview-of-physics-fields-in-unreal-engine/

https://docs.unrealengine.com/5.1/ko/quick-start-for-physics-fields-system-in-unreal-engine/https://docs.unrealengine.com/5.0/en-US/fracturing-geometry-collections-user-guide/https://docs.unrealengine.com/5.3/en-US/PythonAPI/class/FieldFalloffType.html

 

Fracturing Geometry Collections User Guide

Overview of the various methods of fracturing Geometry Collections.

docs.unrealengine.com

 

피직스 필드 시스템 퀵 스타트

카오스 디스트럭션에 영향을 미치고 나이아가라 및 머티리얼과 상호작용하는 피직스 필드를 만듭니다.

docs.unrealengine.com

를 참고하여 글을 작성했으며, 이를 응용하는 과정을 담았다.

 

Physics Field System Setting

 

 

1) 일단 파괴할 액터 하나를 지정하기 위해서 레벨에 액터 하나를 꺼내 놓는다

 

 

2) 해당 액터를 클릭한 뒤 프랙처( = Fracture) 모드로 전환해준다.

 

 

 

 

3) 골절될 모양을 설정해준다 해당 모양마다 다 다른 알고리즘이 적용된다고 한다.

(향후 엔진에 사용된 알고리즘을 공부해보자)

 

 

 

4) 해당 기능 내에는 최소치와 최대치를 적어서
얼마나 잘게 쪼갤지에 대한 설정을 누른 뒤 프랙처를 누르고 끝낼 수 있다.

 

 

이 이후는 굳이 안해도 되는 작업이긴 하지만 추가적인 기능을 이야기 해보겠다.

 

일반 모드로 들어간 뒤, 해당 엑터의 디테일 모드에 들어가서

 

Damege 라고 검색하면, 이러한 수치값 들이 나오게 되는데

해당 수치값 조정을 통해서 fracture가 쪼개지는 데미지 한계치로

더욱 쉽게 부서질지 아닐지를 정할 수 있다.

 

 

해당 값을 넣어주면 속 시원하게 쪼개지지 않던 fracture 설정이 바뀌어

와장창 쪼개지게된다.

 

fracture 기능에는 Level이 있다

ue5 공식 홈페이지 발췌

이는 트리와 구조가 유사한데,

상위에 있는 조각(부모 조각) 아래에 하위 골절 조각(자식 조각)의 구조를 가진다.

각 자식 조각은 차례로 자체의 자식 조각을 포함할 수있다.

큰 조각 부시고 또 거기서 작은 조각 부시고 하는 디테일 까지 챙겨가는 것이다.

 

근데 생각보다 분열되는 조각이 맘에 들지 않는다면,

해당 버튼을 이용해 원하는 결과를 제공하는 구성이 나올 때 까지 시도할 수 있다.

 

물론 다른 세부 값을 조정해서 원하는 모양으로 파괴되도록 조정 할 수 있다.

해당 내용은 ue5 문서에 더 자세히 정리되어 있으니 참고해서 프로젝트를 만들길 바란다.

Mode Toolbar에서도 설정 가능하지만,

이러한 설정은 BP에서도 다른 수치 값들을 조정할 수 있다.

 

BP에서 FieldSystemActor 설정하는 법

 

1) 콘텐츠 브라우저에서 BP Class를 일단 추가해주고, ALL CLASSES를 클릭한다.

해당 기능을 제공하는 FieldSystemActor를 선택해주고 클래스 추가를 해준다.

 

 

2) 필드 시스템 컴포넌트를 하나 놓아주고, Add Transient Field 를 추가해준다.

그럼 bool 변수 하나가 보이는데 이 친구는 기본적으로 이 함수를 작동할지 말지를 체크해주는 친구이다.

이 불변수 체크 없이는 어떤 필드에서도 활성화 될 수 없으니, 체크 되었는지 확인해주는 작업을 필요로 한다.

 

 

 

그리고 Enum으로 다양한 Physics Type들의 열거 상수들이 많다.

다양한 다른 타입들의 물리 유형이 있는데,

우리는 일단 External Strain을 추가해보자.

이 친구를 선택하면 어떤 외부의 힘이 물체에 가해질 때 물체가 부서지도록 허용하도록 하기 좋다.

이름을 직역해보면 외부 변형인데 당연하다.

 

 

3) 충격 중심 위치에 멀어질수록 파괴되는 정도가 떨어져야한다.

방사상 감쇠( = radial Fall off)를 선택하면 된다.

해당 함수에서 Set Radial Falloff 를 선택하면 최소 범위 최대 범위등 어느 정도 힘을 가할지

등등 에 대한 디테일적 부분을 손볼 수 있다. 

해당 함수는 아까 설명한 물체의 index별로 충격파를 수용하는 데미지 한계치에 따라 수치의 정도가 나뉜다.

 

4) 해당 반경(= Sphere Radius)은 물체가 어떤 힘을 받으려면 얼마나 가까이 있어야 하는가를 결정짓는 것이다.

 

그리고 밑에 있는 벡터가 뭔지 궁금하실 수도 있는데

Center Position은 말그대로 엑터가 깨질 중심부라고 생각하면 된다.

그래서 필자는 Get Actor Location으로 self값을 넣어주어 해당 액터의 중심부가

방사되어 깨질 중심부로 설정해주었다.

Falloff Type가 궁금하실 수도 있는데,

 

None는 말그대로 None이고, 

Linear는 힘의 유형이 거리와 1로 나누고 비례할지 inverse는 반비례할지

Squared는 제곱에 비레할지.

Logarithmic은 log(x)로 할지 정하는 거다. 이렇게하면 점점 값이 떨어질 것이다.

기하 급수적으로 올라가는 제곱과 반대로 부드럽게 하락하는 것이다.

 

이렇게 엑터 근처에 물리 시스템을 가져다 대면

실행하기는 한다.

 

 

5) 힘의 방향에 따라 방사형으로 날라가며 쪼개지기

 

이렇게 해주면 액터를 외부 압력을 가해서 산산조각 낸 다음에

비례하는 힘으로 조각에 더 해주어 날라가게 할 수 있다.

 

이렇게 구현하려면 벡터가 필요하다.

 

벡터는 방사형 벡터와 관련된 노드 데이터로 구현하면 된다.

 

당연히 vector 변수로만 vector를 응용할 수 없다. 함수에 값을 넣어줘야하고

그 반경을 설정해줘야하고 중심 위치 벡터도 넣어줘야 한다.

 

 

 

 

이제 add transient field에서 불변수를 모두 켜준 뒤,

두 번째 함수에 날라가는 힘을 주면 되는데,

과하게 높은 값을 주면 힘의 방향이 어디로 들어가는지,

함수가 제대로 작동하는지 알 수 있다.

그런데 이게 깨질 액터에만 영향을 줘야하는데,

캐릭터나 다른 액터에도 영향을 주게된다.

이에 대한 시스템을 구현해보자.

 

6) 메타 데이터 입력이 필요한 이유

 

Mata Date는 개체 참조이다.

참조할 개체를 지정해주려면 일단 필드 시스템 메타 데이터 구성 요소를 추가할 수 있다.

 

해당 Mata Date를 추가해주면,

디테일 패널 필드 아래에 여러가지 타입 유형이 있다.

 

위치 타입 (Position Type) 은 질량의 중심이 되거나 피벗 포인트가 될 수 있는 것이고,

이보다 더 중요한건 개체의 유형의 상태인 Object Type이다.

 

state type 자체를 동적으로 넘겨줄 수 있지만,

 

Object Type에서

박살낼 것이 캐릭터냐, 필드에 있는 모든 rigid타입일거냐 천종류일 거냐 기타 등등에 대한

확고한 포지션을 정해줄 수 있다.

 

Destruction설정을 해놓은 것들만 부셔보자.

 

클러스터를 켜놓으면 대형을 유지해 있고,

클러스터를 켜놓지 않으면 깨지는 파편을 play버튼을 통해 볼 수 있다.

 

클러스터를 켜놓으면 우리가 깨지도록 다양한 방사형 타입 중 골라서 설정해 놓은 

액터들만 깨지는 것을 확인할 수 있다.

 

이제 BP로 구조를 알았으니까 C++로 넘어가서 제작해보자

 

 

완성본

https://www.youtube.com/watch?v=5dYIje_TMa8