작업하던 도중 막히는 부분이 생겨서 생각보다 좀 오래걸렸습니다.

사실은 에픽에서 공짜로준 서브노티카를 너무 재미있게 해서.. 아무튼

저번에는 캐릭터가 허공답보를 하는상태까지 진행했는데요.


앞으로 무엇을 손봐야 할지 대~충 견적을 잡아봅시다.

1. 깡으로 박아둔 카메라컴포넌트를 SpringArmComponent(&)밑에 붙여주기

2. 캐릭터가 위아래로 회전해서 하늘로, 바닥으로 가고있는데 좌우만 회전하게 만들기

3. 중력이 없는 중생에게 중력 선사하기


SpringArm은 Mesh밑으로 들어가고 Camera는 SpringArm밑으로 들어가면 됩니다.

물론 여러분은 센스있게 블루프린트에서 카메라를 좀 손봐주셨으리라 믿습니다.

단순하게 컴포넌트를 하나 추가하고 카메라를 그 밑에 달기만 하면



편안 해지실수 있습니다.

다음으로 해야할건 캐릭터가 막 바닥으로 눕고 하늘로 눕고 하는걸 막는것이죠

이건 생각보다 어렵지 않습니다. 다만 잘 모르니까 찾느라 시간이 오래걸렸지요


위에 보이는것처럼 RotationPich 설정을 해제해주면 됩니다.

순서대로 Pitch, Yaw, Roll(&)이 있는데 해당하는 축은 접힌글을 펼치시면 볼수있습니다.

봐도 잘 모르시겠다구요? 저도 그렇습니다. 아무튼간에 Pitch를 막으면 되는것이죠


이제 땅바닥으로 돌진하거나 하늘로 돌진하는일이 없어졌습니다.

아무리 가상의 존재라고는 하나 위아래는 구분할줄알아야(?) 하지 않겠습니까?

이제 시점을 위아래로 돌린다고 캐릭터도 돌아가버리는 머리 돌아버리는 상황을 방지했습니다.


견적 잡았던것중에 두가지가 부드럽게 지나갔군요. 실제로 크게 어려운것도 없는 단순한 작업이었다고 필자 스스로도 생각하고 있습니다. 다만 마지막으로 남은 중력 적용하기라는것이 필자를 너무나 괴롭혔다는 사실만 빼면 말이지요.


중력을 적용하기까지 많은 시간 CharacterMovement 클래스를 뒤져보고 실제로 이동에 관여하는 함수가 무엇인지 이동이 어느곳에서 실질적으로 적용되는지에 대해서 찾아보느라 시간이 오래걸렸습니다. 필자가 밟았던 길을 다시한번 되돌아보면서 중력을 적용시켜보도록 하겠습니다.


우선은 생성자와 중력이 얼만큼 적용될지를 조절해주는 GravityScale이라는 변수를 만들어줍니다.

이 GravityScale변수는 생성자부분에서 1.0f으로 초기화 시켜주시고 중력을 적용시키기 위한 코드를 작성하러 가보도록 하겠습니다.


위 사진에 밑줄쳐져있는 GetWorld() 함수를 호출해서 사용하시려면

#include "Engine/World.h" 를 해주셔야 합니다.


HitResult 변수는 중력을 먼저 체크하기위해서 밖으로 빼두었고 Rotator를 매번 함수를 통해

받아오는게 마음에 들지 않아서 따로 받아둔다음에 여러번 사용하게 만들었습니다.


우선 이번 프레임의 중력값을 Velocity에 값을 계산하여 넣어주고 SafeMoveUpdatedComponent(&)함수를 통해서 이동을 시켜봅니다. 


하염없이 떨어지는 그대여 어디까지 가나요

이놈의 캐릭터는 중력좀 적용한다 해봤더니 그런거 모르겠고 일단 내려갑니다.

중력인지 엘리베이터인지 알수가 없네요 아주 ㅋㅋ


쓸데없는 가설로 인하여 수시간의 삽질을 한결과 이유를 알아내기는 했습니다.

일단 SafeMoveUpdatedComponent함수에서는 이연결되어있는 UpdatedComponent를

기준으로 충돌체크를 하게 되는것인데 현재 연결되어있는건 RootComponent이고

이 RootComponent는 SceneComponent로 되어있습니다. 이게 무슨소리인가 하면 이 SceneComponent는 충돌체크를 할만한 뭐 껀덕지가 없어요 너무작고 충돌체도 존재하지 않습니다.


이때 깨닫게 된것입니다. 언리얼에서 기본 제공해주는 Character클래스의 RootComponent가 Capsule인지에 대해서 말이죠. 이러한 이유였던 것입니다. Movement클래스에서 업데이트해줄 대상은 보통 RootComponent가 되는것인데 이렇게 SceneComponent를 Root로 두게된다면 이와같이 중력적용시에 문제가 생기게 된다는것이죠


일단 모르겠고 그럼 업데이트할 대상을 현재 Root인 SceneComponenet가 아니라 Mesh밑에 있는 Capsule로 지정해준다면 해결할수 있는 문제아니겠습니까? 생각이 들어서 바로 실행해 봤습니다.


움짤 화질이 좀 별로여서 그렇지만 잘 보시면 캡슐형태의 충돌체가 중력으로 인해 바닥에 붙어서 움직이는것을 보실수 있습니다. 그런데 보시면 좀 의아하게 느껴지시는 부분이 있을텐데 캐릭터의 메쉬는 안움직이고 중심을 기준으로 캡슐이 움직이고 있는걸 알수 있으실겁니다.

이건 3D프로그래밍의 기초적인 부분이니까 설명하지 않아도 되리라 믿습니다.


결과적으로 Movement컴포넌트에서 업데이트 해줄 대상을 충돌확인이 훨씬 유리한 캡슐컴포넌트로 바꾸었더니 잘 작동합니다. 대신 실질적으로 움직이고 있는건 캡슐 컴포넌트이기 때문에 메쉬 그러니까 즉 RootComponent가 이동하고 충돌검사는 캡슐로만 할수있게 해야합니다.


몇가지 과정을 처리해주시면 이렇게 안정적으로 땅을 밟고서 물체와 충돌처리도 되는

훌륭해진 캐릭터를 볼수있게 됩니다.


이번 글도 여기서 마무리를 하도록 하겠습니다. 쓴 내용은 별것도 없는데 시간이 너무 많이 지나가 버렸네요 다음에는 뭘 할지 생각좀 해보고 천천히 올리도록 하겠습니다.


과정은 어디갔냐구요? 필자는 힌트를 다 드렸으니까 읽는 여러분이 직접 부딪히면서 해결방법을 찾아보세요. 절대로 나만 이 족같은 기분을 느낄수 없어서 이런것은 아닙니다.

Posted by 별수집가
,