진도나간건 별것도 없는데 벌써 캐릭터 하나 만드는동안 넘버링이 6까지 와버렸습니다.
저번 글에서 깜빡하고 지나쳐 버린게 하나 있었는데 글을 읽으신 분들이 눈치 채셨을지는 모르지만 제가 찝찝하니까 짚고 넘어가야 할거 같네요
저기 빨간색으로 밑줄 쳐져있는 WalkableFloorZ라는 변수와 그에 관련된 다른 변수, 함수들에 관한 이야기 입니다.
우선 저 변수는 언리얼에서 제공하는 CharacterMovement에서 설정하는 값이랑 동일한 역할을 하는 용도이며 저걸 가져옴으로써 3개의 함수를 같이 가져오게 되었습니다. ISWalkable함수를 쓰기위해서 가져온 변수가 짐을 많이 들고오게 된것이지요
두 변수의 차이점은 Angle은 저희가 흔히쓰는 360도를 의미하는 디그리(Degree) 값을 저장하고 Z는 라디안(Radian)값을 저장하는 변수입니다. 보시는것처럼 Angle의 UPROPERTY의 meta설정 부분을 통해서 에디터 내에 해당 변수의 최소, 최대값을 고정시킬수가 있음을 확인하실수 있습니다.
이번에는 함수 두개를 한번에 올려드렸는데 이 두개의 함수는 서로를 보완해주는 역할이라서 그렇습니다. 내용을 보시면 어려운것은 없으니 긴 설명은 안하고 넘어가겠습니다.
가장 중요한 함수를 소개할 시간이 되었습니다. 위 함수는 보시는 바와같이 전처리기if 조건을 통해서 에디터 상에서만 작동을 하도록 조건을 걸어두었습니다.
저 함수는 에디터에서 변수를 조정할떄 불러지게되는데 만일 변경되는 변수가 에디터에서는 접근할수 없는 다른 변수와 연계가 되어야 하거나 영향을 끼친다는 가정하에 저런식으로 오버라이딩 해서 작성을 해주시면 됩니다.
실제로 필자또한 이번 Movement클래스를 구현하면서 언리얼 소스코드를 열심히 보지않았다면 알수 없었던 부분이었습니다. 내용적으로 어려운 부분은 없으나 이러한 기능이 있다는것을 알고계신다면 코드상에서 작동할 변수이나 에디터의 영향을 받아야 하는 경우에 하나의 방법이 될 수 있다 생각해서 넘어갈수가 없었습니다.
이걸로 저번 포스팅에서 잊어먹고 설명하는걸 까먹었던걸 해결했으니 남아있는 이동 부분에 대해서 설명을 계속 이어나가보도록 하겠습니다.
<미련이 남아 덕지덕지 달아둔 주석들>
코드가 좀 깨끗하지는 않지만 나름의 고군분투가 있었다고 생각해 주시면 좋을거 같습니다. 캐릭터의 현재 이동상태를 이용해 중력을 적용하고 CurrentFloor도 갱신해 주었으니 이제 남은건 전진 또 전진뿐 입니다.
언리얼 소스코드의 MoveSmooth에서는 필자가 올린것과는 다르게 실제로 더 많은 내용이 들어가 있습니다. 하지만 필자의 경우 필요에 맞춰서 간략화 시키는게 목표였기 때문에 대폭 줄이고 약간의 여지를 주석으로 남겨두었습니다.
우선 이동값을 계산하여서 입력이 없으면 돌아가고 있을때 MoveAlongFloor함수를 실행시키는 간단한 문지기 역할을 합니다.
함수의 시작과 동시에 CurrentFloor를 확인해서 걸어다닐수 있는 지형이 아니라면 코드를 실행하지 않고 return시킵니다. 만일 걸어다닐수 있다면 현재 밟고있는 지형에 부딪히지 않고 매끄럽게 지나갈수 있도록 이동벡터를 생성해주어야 하는데 그 역할을 ComputeGroundMovementDelta함수에서 해줍니다. 실질적으로 지형의 높낮이에 맞춰 부드럽게 이동할수 있게 해주는 가장 핵심적인 코드는 위 함수에 있기 때문에 설명을 시작하도록 하겠습니다.
함수로 들어오는 인자들은 각각 지형에 관계없이 진행할 방향 벡터, 중력체크당시에 구한 CurrentFloor의 Hit결과값과 LineTrace를 통한 결과인지를 받습니다. 보시면 if문에 IsWalkable함수를 주석쳐놨는데 필자의 판단상 굳이 저기서까지 확인할 필요는 없을것 같아서 패스했습니다.
충돌한 지점의 노말값과 캐릭터의 전징방향을 통해서 지형에 충돌하지 않는 방향으로 이동벡터를 생성해내고 그걸 반환시키는 코드입니다. 막상 확인하고 보니까 좀 허무한 기분이 들기도 했지만 수학에 대해서 기본적인 수준과 응용력을 지니신 분들이라면 막히지 않고 잘 하셨을거 같습니다. 필자는 수학에 상당히 약한편이다 보니 이해하는데 시간이 꽤나 오래걸렸지만 말이지요
그다음엔 별것 없습니다. 구한 벡터를 통해서 이동을 시켜보고 만일 부딪힌다면 일단 지형은 부딪히지 않도록 조치를 취해두었으니 장애물일것이 분명하기 때문에 미끄러지게 처리를 해주면 됩니다.
막상 정리하고보니까 글이 별로 길지도 않고 이렇게 나눠야 할 필요가 있었나 싶기도 하지만 믿어주세요. 어제는 너무나 피곤해서 더이상 글을 쓸수가 없는 상황이었습니다. 이제 필자는 다시 작업을 하다가 정리할 만한 내용이 생기면 들고오도록 하겠습니다.
'프로그래밍 > 언리얼' 카테고리의 다른 글
언리얼로 만들어보는 RPG - 인벤토리 구현(1) (1) | 2019.01.31 |
---|---|
언리얼로 만들어보는 RPG - 캐릭터 구현(7) (2) | 2019.01.29 |
언리얼로 만들어보는 RPG - 캐릭터 구현(5) (0) | 2019.01.09 |
언리얼로 만들어보는 RPG - 캐릭터 구현(4) (0) | 2019.01.06 |
언리얼로 만들어보는 RPG - 캐릭터 구현(3) (0) | 2019.01.02 |