안녕하세요 여러분 작업에 정신이 팔려서 정작 중요한 작업일지에 소홀해져버린 필자가 돌아왔습니다.


마지막 포스팅을 두어번 정도 다시 읽고 나서야 어디서 부터 시작을 해야할지 감을 잡게 되었네요. 저번 포스팅에서는 필자를 매우 괴롭혔던 경사면 처리를 해결했었군요. 이번 포스팅에서는 캐릭터의 이동을 마지막으로 마무리할 예정입니다.


카메라가 보는 방향을 기준으로 8방향 이동이 가능하게 하는게 기본적인 계획입니다. 특별히 크게 어려울 거라는 생각은 안하고 있었습니다만..

<누구나 그럴싸한 계획은 가지고 있다>


언제나 모두에게 적용이되는 훌륭한 명언을 만들어낸 타이슨 선생님의 말씀처럼 계획대로 굴러갈 수는 없는 노릇이지요.


우선 좀더 구체적으로 계획을 잡아봐야 합니다.

1. InputVector에 속도를 곱해서 넣지않고 방향에 대한 값만 집어넣어줘야합니다.

2. 들어온 InputVector를 기반으로 카메라의 방향을 이용해서 이동방향 정해주기


당장 생각나는건 이 두가지 정도인거 같습니다. 그러면 바로 작업으로 들어가도록 하는게 좋겠네요


저번과 다르게 이동함수에서 이동속도롤 곱하지 않습니다.

왜냐하면 들어온 InputVector의 값을 참고해서 카메라를 기준으로 방향을 잡아서 이동시킬것이기 때문입니다.


위 사진의 빨간 밑줄쳐진 부분을 보시면 아시다시피 SimulateGravity함수의 매개변수에서 FRotator를 뺐습니다. 또한 Player의 RootComponent에서 가져오던 Rotator를 Camera로부터 가져오도록 변경을 했습니다.


저번코드에서는 Rotator를 받아서 이용했지만 카메라의 방향을 기준으로 삼아야 하기때문에 이동시에 현재 Rotator를 저장해서 이용하기로 했습니다.

<이동할 당시의 카메라 방향을 저장해줄 CurrentRotation 변수>


다음으로 살펴볼 함수는 moveSmooth함수입니다.


저번이랑 다르게 내용이 좀 늘어났는데, 들어온 InputVector에서 X축과 Y축의 값을 이용하여 현재 캐릭터가 어느 방향을 향해야 하는지 구합니다. 그렇게 구한 Delta벡터를 정규화 시켜서 방향벡터로 만들어내고 이를 플레이어의 이동속도와 DeltaSecond를 곱해서 Velocity에 대입합니다.


그렇게 구한 Velocity의 회전정보를 CurrentRotation에 넣어주고 MoveAlongFloor 함수를 실행시키면!


<필자의 의도대로 잘 이동하는 모습>


하지만 역시나 하나를 해결하면 또다른 문제가 터지기 마련입니다. 기분 좋게 언덕을 올라가는 테스트를 하다가 큰 문제점을 몇가지 발견했는데요. 옆을보고 언덕을 올라간다던가... 너무 높은 경사를 꾸역꾸역 올라간다던가 하는 문제들이었습니다.


<딱봐도 높은 언덕을 요상하게 올라가는 캐릭터>


이 문제도 해결하기 위해서 하루정도 시간이 들어갔었는데 찾아보니 옆을보고 올라가는경우에는 SlideAlongSurface함수에서 Rotator를 적용하는게 여전히 RootComponent함수 에서 가져오기 때문이었고 높은곳을 꾸역꾸역 올라가는건 MoveAlongFloor함수 에서 충돌부분을 뭉뚱그려 처리해서 였습니다.


미끄러지는 처리를 해줄때 CurrentRotation을 집어넣어주면 어색하게 다른방향을 바라보면서 언덕을 올라가거나 벽을 따라 미끄러지는 경우를 해결해줄 수 있습니다.


빨간색으로 테두리를 친 부분이 변경된 부분입니다.


이전 작업에서는 충돌하거나 뚫었을경우에 둘다 미끄러지도록 작성했지만 이때문에 경사가 높아도 그냥 올라갈 수 있었던 것입니다. 이제는 뚫었을 경우에 올라갈 수 없는 벽같은 물체를 만난것으로 가정하고 미끄러지게 하고 충돌했을경우에는 충돌 대상을 확인하여 현재 밟고있는 바닥일 경우 경사가 걸어 올라갈 수 있는 경사인지 확인후 경사벡터를 다시 구해 이동시켰습니다.


<정상적으로 잘 올라가고 경사가 가파르면 막힌다>


이로써 캐릭터의 기본적인 구현이 끝났습니다.

다음 포스팅 부터는 캐릭터의 인벤토리를 구성하고 UI를 만들어서 화면에 띄우는걸 해보도록 하겠습니다. 


개인적인 여담이지만 UI작업을 해본적이 별로 없어서 많이 헤매고 정보를 찾는데 시간도 오래걸렸었습니다. 차근차근 짚어가면서 포스팅을 할테니 시간이 좀 걸릴 수 있다라는 변명입니다


아무튼 기다려 주신분들이 있을지 모르겠으나 긴시간 기다려주셔서 감사합니다.

Posted by 별수집가
,