그러면 저번 게시글에서 제작한 스크립트를 캐릭터에게 추가를 해줍시다.

Add Component를 이용하여 추가하면 이렇게 나옵니다.


그러면 코드를 분석을 해볼 것인데

하기에 앞서서 이동할 때에 고려사항으로는 목적지의 방향과 어느 정도의 이동 속도를 가지고 있는 것인지입니다.

일단 먼저 지형의 다양성은 전부 배제하고 평지라고 가정을 한 상태에서 목적지 방향으로 이동시키는 것을 생각합니다.

방향 벡터는

방향 벡터 = ( 목적지 위치 - 현재 위치 ) / 목적지까지 거리

이렇게 구합니다.


그리고 방향 벡터는 이동 속도 벡터를 구하기 위해서 이동속도와 곱해줍니다.

이동 속도 벡터 = 방향 벡터 X 이동 속도

그리고 이동 속도 벡터도 각 프레임의 이동량을 구하는 용도로 사용이 됩니다.

각 프레임의 이동량 = 이동 속도 벡터 X 1프레임의 시간


이러고 나서 위치를 새로 갱신한다면 플레이어를 이동시킬 수 있습니다.

새로운 위치 = 현재 위치 + 1프레임의 이동량


모든 이동에는 제로백이라는 것이 존재하리라고 믿습니다.

아마도 그럴것이죠

자동차도 그렇고 맹수도 그렇고 학교 운동회만 보아도 제로백이라는 것이 존재하는 것을 알 수 있습니다.

이동속도라는 것이 처음부터 10m/m가 바로 되는 것이 아니라 0m/m에서 10m/m까지 가속이라는 것을 합니다.

그렇듯 자연스럽게 이동을 시키려면 이렇게 합니다.

이동 속도가 서서히 (방향 X 이동 속도) 에 가까워지게 보간을 합니다.


그러면 1/3일에서 목표까지는 t = 1프레임의 시간 X 3(단, t > 1일 땐 t = 1 )으로 합니다.

그리고는 다음과 같이 보간을 해서 이동 속도 벡터를 구합니다.

이동 속도 벡터 = (방향 X 이동 속도) X t + 현재의 이동 속도 벡터 X (1 - t )



그럼 이제는 매끄럽지 못한 지형을 신경을 씁니다.

경사로가 급한 비탈길은 못가게 그리고 지면에 붙어서 이동을 해야합니다.

생각을 해보세요 앞에 경사로인데 그대로 그냥 직진을 합니다. 경사로를 오르지 않고 참 재미있는 게임이 나오겠군요!


원래는 이런 동작은 구현하기가 쉽지 않다고 합니다.

그렇지만 유니티에는 캐릭터 이동에 특화된 CharacterController라는 컴포넌트가 있기에 가능하다고 합니다.

수평 이동의 이동량만 계산하면 접지판정은 CharacterController의 Move 함수가 담당을 한다고 합니다.

그러려면

수평 이동량 + 중력 이동량

이렇게 구해서 CharacterController의 Move함수에 전달을 해야합다.


그렇다면 다음 게시글에서 진짜 본격적으로 스크립트를 설명할 것인데요


그러기 위해선 흐름이라는 것이 필요합니다.

그 흐름에 대하여 설명을 먼저 하도록 하겠습니다.

요런 흐름을 가지고 있습니다......


어머 오류가 있는데요

지면에 닿아 있는가? 이 질문에 닿아있다면 방향을 구하고 아니라면 중력 가속을 처리하는 것입니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,