1

의식의 흐름대로 게임 만들기 2. 플레이어 이동 보완

의식의 흐름대로 게임 만들기 2. 플레이어 이동 보완

노아의 블로그

    목차
반응형

이 페이지에서 배우는 내용 

-Axis

-백터의 정규화

 

안녕하세요. 저번에는 플레이어 이동을 해보았습니다.

 

하지만 문제가 있죠. 바로 위로 이동하는 기능만 만들었습니다.

저희가 추구하는것은 상하좌우모두 만들어야 합니다.

이런식으로 모두 만들까요? 그것도 하나의 방법이기도 하지만..

기본적으로 코드는 가독성과 효율이 좋아야 합니다.

 

가독성을 높이기 위해

유니티의 또다른 기능을 사용할 것 입니다..

 

Input.GetAxis라는게 있죠! 

이런 코드를 작성하고

A,D 키를 눌러보면...

아무것도 안할 시 0만 출력되고

A를 누르면 0에서 -1까지 서서히 증가하고

D를 누르면 1까지 서서히 증가함을 볼 수 있습니다.

 

감이 오시죠? 네.. Axis로 받은 값은 결국 키보드의 방향을 의미합니다. 

이것으로 플레이어를 이동 시키려면 키보드의 방향으로 백터(방향)를 만드는것이죠!!!!

 

Horizontal은 수평이니까 A,D에 해당하고

수직은? Vertical이죠. W,S에 해당합니다.

 

키보드의 AD는 좌우..즉 x축에 해당하겠네요.

W,S는 상하 .. y축에 해당합니다.

이렇게 키보드의 방향값을 float(실수) 로 받아서 

 

새로운 방향 백터를 만듭니다.

 

그리고 자신의 위치에 값을 더해서 이동하죠...

 

실행을 해보면?

 

정말 간단하게 상하좌우로 이동하는 캐릭터가 완성되었습니다. 

 

 

 

정말 완벽합니다!!!!!!!

 

이제 플레이어 이동 끝~ .... NO NO!

 

아직 한발 남았다.....

 

무엇이 문제일까요? 한번 이 영상을 보면서 Vector 값에 대해 생각하면서 추측해 봅시다.

 

 

 

정답은??

 

자... wasd 각각 1개씩만 누를때 생성되는 백터는

결국 1입니다.

 

w = 1

a = -1

s = -1

d  = 1 

-1 이든 1이든 결국 크기는 1입니다. 하나만 존재할때만요.

 

하.지.만 

w,d키를 동시에 눌렀다고 해 봅시다. 

그러면 (1,1) 이라는 백터가 생성되겠죠.

 

이러면...크기가 1이 아니죠?

 

다시 그림!

 

 

 

w,d키를 눌렀을때 생성되는 백터를 시각화한 모습입니다.

 

아...어떤 도형이 보이는군요!!! 바로 삼각형입니다.

 

백터의 크기는 화살표의 길이라고 했습니다!

 

피타고라스 형님에 의하면 화살표의 길이(백터의 크기)는 루트 2입니다.

 

즉!!!! 1보다 크다는 소리입니다. 따라서 대각선으로 이동할때만 속도가 빨라지는 이상한 게임이 된다는것이죠..

 

이런 말도 안되는 소리가 있나요? 하지만 걱정마세요. 

 

우리가 만든 이동 공식은 방향 * 시간 * 속력입니다.

문제점은 방향 백터의 크기가 루트2라는 문제죠.

 

즉 방향(화살표)은 원래만큼 가지고 있되, 방향 백터의 크기(화살표의 길이)를 1로 줄여주면 정상적으로 돌아오겠죠!

 

-와 대단하네요! 그래서 어떻게 줄이나요?

 

바로바로~ 원을 그립니다.

 

반지름의 길이가 1인 원을 그려서 

 

삐져나온 만큼만 뺀다면? 방향은 유지되고 크기가 1인 백터겠죠!

 

이것을 백터의 정규화(normalized) 라고 합니다.

 

방향을 백터를 만들고 바로 밑에다 Normalize를 해줍니다. 그러면 알아서 dir은 방향은 유지하고 크기가1인 백터로 변합니다. 

 

대각선으로 이동해도 속도가 똑같습니다. Good!

반응형