본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티 구현 정리_Implement Summary

유니티 각개격파_013_벡터(Vector)와 이동(Translate)_키보드 이동

계속해서 이번에는 큐브를 키보드의 키 값을 입력받아서 움직여본다.

 

먼저 Edit > Project settings를 클릭한 후 Input Manager (입력 관리자)를 선택해보자.

 

유니티 엔진에서 기본으로 설정되어 있는 입력시스템(Input System)을 볼 수 있다.

 

제일 위에 있는 Horizontal (수평)을 클릭하면 Negative Button (음(-)의 값 버튼)은 left(왼쪽) 화살표키 , 양(+)의 값 버튼은 오른쪽 화살표키로 정해져 있다. 또한 대체할 수 있는 (Alternative) 키는 a 와 d 키로 정해져 있다.

즉, 왼쪽 화살표키는 A키와 같고, 오른쪽 화살표키는 D와 같다.

 

수평(좌우)으로 움직일 때 음(마이너스)의 값 또는 양(플러스)의 값을 받고 싶으면 해당 키를 누르면 된다는 뜻이다.

즉, 왼쪽 방향키 또는 A키를 누르면 실제로는 ( -1 ) 값을 전달 받고, 오른쪽 방향키 또는 D키를 누르면 ( +1 ) 값을 전달 받는다.

 

키를 눌렀을 때 전달 받은 값(-1 또는 1)을 코드에서 사용하기 위해 2가지 함수가 만들어져 있다.

Input.GetAxisRaw( )

Input.GetAxis( )

 

GetAxisRaw()는 즉각 -1 또는 1을 전달하고, GetAxis()는 0 에서 1 또는 0 에서 -1까지 서서히 증가하는 값을 전달한다.

참고로 이 값들은 float타입이다.

 

제일 아래에 Joy Num를 보면 조이스틱 움직임으로도 Horizontal(수평) 입력 값을 받을 수 있다.

 

지정한 Key나 값은 수정할 수도 있지만 정확히 아는 것만 손대는 것이 좋을 것 같다.

그 아래에 있는 Vertical (수직)도 확인해 보자.

 

Scripts 폴더에 있는 MoveCube 스크립트 파일을 편집하자.

코드를 위와 같이 수정한다.

 

코드의 전체 흐름은 다음과 같다.

  1. Move( ) 메서드에 움직임을 구현하는 코드를 작성한다.
  2. Move( ) 메서드를 Update( )메서드에 넣어서 매 프레임마다 실행한다.

이전 글에서는 큐브가 스스로 움직이도록 했다.

이번에는 키보드나 조이스틱으로 입력 받은 x, y 값을 direction(방향)으로 지정해서 움직여 본다.

 

21번 줄에서 float타입의 변수 (horizontal)를 하나 만들고 여기에 Horizontal 축 값을 가져와서 저장한다.

축 값을 가져올 때는 Input.GetAxis( )를 사용한다.

 

22번 줄에서 세로 축 값도 같은 방법으로 가져온다.

 

24번 줄에서 방향 값을 저장하기 위해 Vector3 타입의 변수를 하나 만들고 x, y 축에 키보드에서 받은 축 값을 새 벡터3로 만든다.

 

결국 벡터3 타입의 direction 변수에는 키보드를 눌렀을 때 받은 x, y축의 음 또는 양의 값이 저장된다.

 

26번 줄에서 큐브를 이동하기 위해 방향과 속도를 곱한 값을 Translate( ) 메서드의 매개변수로 넣어준다.

Time.deltaTime은 Update( )메서드에서 호출하는 프레임 간격(초)을 나타낸다.

이 값을 곱해주면 일정한 속도를 얻을 수 있다.

 

쉽게 말하면 설령 Update 안에서 처리할 내용이 많더라도 Update( )메서드 안에서 일정한 프레임 시간을 불러와서 곱해주어 속도 변화가 거의 없게 하는 역할이다.

 

물리 계산을 사용하는 이동의 경우에는 FixedUpdate( )라는 메서드를 사용하면 된다.

fixed (수정된, 고정된)라는 용어에서 알 수 있듯이 프레임 마다 물리 단계에 맞춰서 수정하여 실행하기 때문에 Rigidbody같은 물리 컴퍼넌트를 사용할 때는 FixedUpdate메서드를 사용하도록 한다.

 

간단한 코드의 경우는 실제로 차이를 느끼지 못하지만 속도와 관련없는 키보드 입력 같은 코드들은 Update 메서드에 넣고 속도 또는 물리와 관련된 코드는 FixedUpdate에 넣는 것이 기본이라고 한다.

그리고 FixedUpdate( )메서드에서 사용하는 시간은 Time.fixedDeltaTime 이다.

 

위에서 작성한 코드를 다른 방법으로 표현해보자.

Translate메서드는 물리를 사용하지는 않지만 FixedUpdate를 사용해서 다음과 같이 작성할 수도 있다.

 

Move( )매서드에 매개변수로 direction을 입력 받도록 하고 FixedUpdate( )메서드에서 키보드로 입력받은 x, y 값을 새 벡터로 전달하여 Translate( )에서 direction 값을 전달 받아서 움직이도록 한다.

 

GetAxisRaw는 키보드 키를 눌렀을 때 -1 , 0 , 1 값만 즉시 받을 때 사용하는 메서드이다.

GetAxis는 값을 입력받을 때 0에서-1까지 또는 0에서1까지 점진적으로 부드럽게 증가하는 값을 받는다.

이동에 적용하면 즉시 움직이려면 GetAxisRaw, 부드럽게 움직이려면 GetAxis메서드를 사용하면 된다.

 

arguments(인수)를 매개변수에 전달하는 프로그래밍다운 표현이다.

 

또한 다음과 같이 Update메서드와 FixedUpdate메서드를 함께 사용하여 코드를 작성할 수도 있다.

Update 메서드에는 키보드 키를 눌렀을 때의 값을 getKeyValue(키 값 받기) 라는 변수를 만들어 저장하고

FixedUpdate 메서드에는 실제 움직임이 일어나는 Move메서드로 키 값을 인수(매개변수)로 전달하여 실행한다.

 

지금까지 본것 처럼 같은 움직임도 다양한 방법으로 코드를 작성할 수 있기 때문에 어떤 코드가 가장 효율적이고 원하는 기능 구현에 적합한 지 찾는 것이 중요하다.

 

코드를 저장한 후 유니티를 실행하면 a, d, s, w 키 또는 방향키를 눌러서 큐브를 상하좌우로 움직일 수 있다.

 

 

결론적으로 Translate( )메서드는 position(위치)를 변경한 움직임이므로 빠른 이동이 가능하다.

그래서 게임에서 물리가 필요한 캐릭터 등의 움직임에 사용하기 보다는 주로 물리 적용이 필요없는 이동에 사용한다.

 

다음 글에서는 마우스로 움직이는 방법을 알아본다.

 

끝.

Wraven...