[UE5 : 3D(BP) - 캐릭터] Chapter 01. 캐릭터 생성
GitHub : https://github.com/developeSHG/UE5-3D_BP/commit/58c67ffe8ae15494877e1943139084fcc8fa85c5
Skeletal Mesh가 관건이다.
이전에 실습했던 것은 Static Mesh라는 걸 살펴본 적이 있다.
Static은 정적이다. 바뀌지 않는다.
근데 스켈레털 메쉬의 경우는 메쉬는 메쉬며 삼각형으로 이루어진 것은 맞지만, 스켈레털 즉 어떤 스켈레톤을 기반으로 되어 있다.
만약 걸어다니는 모션을 하고 싶다면 어떻게 해야할까? 2D처럼 캡쳐해서 걸어다니는 것처럼 보이게 해야할까?
아니다. 위 사진처럼 메쉬는 삼각형들이 어마무시하게 많다.
그렇다는 것은 메쉬 하나를 표현하기 위해 정보가 굉장히 많이 필요한데, 위치에 따라서 조금씩 움직이는 정보를 표현하기 위해 삼각형을 몇십개씩 만들 수는 없다.
그래서 3D 애니메이션을 적용할 때는 무식하게 여러 개싀 메쉬를 만들어서 바꿔치기 하는 것이 아니라, 뼈대를 장착해서 그 뼈를 움직이는 것처럼 작동을 하게 된다.
가슴을 움직이면 허리가 같이 움직일 수 있는 것처럼 인체가 계층 구조로 되어있다는 걸 알 수 있다.
결국 메쉬를 단순하게 만들어 주는 게 아니라 이렇게 뼈대 모양과 계층 구조로 만들어 줘서 설정을 해놓은 다음, 실질적으로 애니메이션을 만들 때는 어떤 뼈가 얼만큼 움직인다 라는 정보를 기입하게 되면 아래와 같은 애니메이션이 만들어진다.
일일이 모든 정보에 대한 좌표들을 2D 애니메이션처럼 하나 하나씩 만드는 것이 아니라 뼈를 움직여서 만들고 있기 때문에 최소환의 정보로 자연스러운 행동을 만들 수 있게 된다.
언리얼 엔진을 사용하면 이런 것을 다 만들어져 있기 때문에 깊이 이해할 필요는 없지만, 기본적으로 스켈레탈 메쉬가 왜 스켈레탈 뼈라는 이름이 붙어있는지 이해할 수 있다.
그럼, 메쉬를 컨트롤 하기 위해 블루프린트 클래스로 관리해주는데, Pawn이 아닌 Character로 만든다.폰은 액터는 액터인데 컨트롤을 통해 입력 받을 수 있고, 빙의가 될 수 있는 액터를 폰이라고 한다면,캐릭터는 추가적으로 걸어다니고 점프하는 등 기능이 있다. 그래서 캐릭터를 상속받는 클래스를 만든다.
Edit in C++는 강제로 삭제할 수 가 없다. 즉, 캐릭터에서 딸려오는 부품들이라 태생적으로 포함이 되어 있다.
캐릭터를 상속받아서 만드니 Mesh라는 부품이 포함이 되어있다.
그렇다는 것은 얘를 그냥 빈 깡통으로 만드는 것이 아니라, 스켈레탈 메쉬를 넣어서 설정하면 된다.
보면 위치가 좀 묘하게 공중부양을 하고 있는 것처럼 보이는데, 이것은 모델링을 할 때, 어디를 기준으로 만들었는지가 관건이라 현재 발을 기준으로 좌표가 세팅되어 있어서 그렇다. 그래서 캡슐안에 딱 들어오게끔 직접 수정해주면 된다.
이전에는 Set Actor Location을 이용해 플레이어를 직접적으로 조작해서 그 좌표를 설정했었다.
이번엔 다른 방법을 이용할 것인데, Add Movement Input 이란 것이다.
조금 다른 것이 뭐냐면 내가 어떤 방향으로 이동하려고 하는지 그 의도 자체를 World Direction에다가 꽂아준다.
Set Actor Location을 이용했을 때는 이동할 좌표를 바로 계산해서 넣어줘야 되기 때문에, Delta Secnod와 Speed를 곱해서 한 프레임 동안의 이동 거리를 구해준 다음, 그것을 현재 위치에 더해줘서 결과 좌표를 꽂아줬다.
하지만, Add Movement Input은 그런 개념이 아니라, 단순하게 어떠한 방향으로 가고 싶어하는지 의도 자체만 넣어주면 당장 이동하는 코드가 실행되는 게 아니라 나중에 Movement Input에 넣어준 모든 값들을 다 합산해서 합산된 결과를 한 번 소모를 해주게 된다.
이때, consume 이라는 용어를 쓴다. 그래서 예를 들면 Get Movement Input 두 가지가 있다.
이런 것을 이용해서 이전에 넣어줬던 모든 벡터들의 합산을 이용해 구해준 다음, 이동처리를 해주고 이전 틱에서 넣어줬던 모든 값들을 다시 리셋해주는 식으로 동작하게 된다.
동작 방식이 다르다는 말.
그래서, 이렇게 값을 넣어준 것은 어느 기준으로 누가 처리해주느냐 라고 하면,
Character Movement Component가 소모해주게 된다.
만약에 이 코드를 똑같이 Pawn에 적용하게 되면 아무 동작도 안하게 된다. 왜냐면 실제로 이것은 이 방향으로 이동하겠다는 의도만 표현해준 것이지, 실제로 이동코드는 들어가 있지 않기 때문이다.
캐릭터 무브먼트는 자동적으로 코드 안에서 본인이 넣어준 Movement Input 의사를 소모시키는 개념을 겸하고 있기 때문에 이동과 관련된 루틴이 실행된다.
Character Movement Component에는 물리 공식을 적용할 수 있게끔 굉장히 많은 기능들이 들어가있다.
중력 영향, 땅의 마찰력 같은 것을 Breaking Deceleration 등 묘사를 하고, 수치들을 조금씩 건드려 가장 자연스러운 형태를 만들면 된다.
정리하자면, speed 등 디테일 한 것은 Character Movement에서 세팅할 수 있고, 결과적으로 Add Movement Input 에다 꽂아주는 벡터는 Scale Value랑 곱해져서 내가 이동하고 싶은 방향에 대한 의사 표시를 해주는 것이다.
그 의사 표시가 만약 여러 개가 있다고 하면 벡터에 합산이 되어, 최종 결과물 하나로 연산하게 되는데 크기가 0~1 사이면 감소가 일어날 것이고, 1보다 큰 상태면 정상적으로 Character Movement에서 정한 최대 속도까지 갈 수 있다.