유니티에서 입력을 감지할 때 일반적으로 Input 클래스를 사용한다.
GetKeyDown()
- 키가 눌리는 순간을 감지GetKeyUp()
- 키를 놓는(release) 순간을 감지GetKey()
- 키가 누르고(hold) 있는지 감지위의 3개가 일반적으로 쓰이는 메소드이며, 파라미터로는 키코드 또는 이름을 줄 수 있다.
우선 키코드는 키보드의 있는 키에 매핑된 번호라고 볼 수 있으며,
KeyCode.Space // space bar
KeyCode.Escape // Esc
위와 같이 불러서 쓸 수 있다.
즉, 사용자가 화살표 키를 누를 때마다 캐릭터를 이동시키고 싶다면, 아래와 같은 로직을 사용할 수 있다.
if (Input.GetKeyDown(KeyCode.RightArrow) {
// 오른쪽으로 이동
transform.Translate(Vector3.right * Time.deltaTime * step);
}
if (Input.GetKeyDown(KeyCode.LeftArrow){
// 왼쪽으로 이동
transform.Translate(Vector3.left * Time.deltaTime * step);
}
그러나, 위와 같이 짠 경우, 캐릭터의 이동은 끊겨 보일 것이다. 우선 GetKeyDown
메소드를 사용했기 때문에, 사용자가 키를 한번 누를 때 마다 이동이 한번씩만 이루어질 것이다. 오른쪽 끝으로 가고 싶은 경우 키를 연타해야 하는 것이다. 이럴 때 사용할 수 있는 메소드로 GetAxis()
가 있다.
GetAxis()
파라미터로 axisName
를 받는데, 이 축은 유니티 에디터의 Input Manager에서 작성할 수 있다.
[Unity Editor] > [Edit] > [Project Settings]
[Input Manager] > [Axes]
이미 작성된 축이 몇가지 있다.
이 중 "Horizontal"을 열어보면, Positive Button으로 right, Negative Button으로 left 키가 지정된 것을 볼 수 있다. 즉, 해당 축의 입력을 받으면 좌우 화살표 키의 입력을 [-1, 1] 범위로 돌려준다는 것이다.
위의 코드를 GetAxis()를 사용해서 다시 구현해보면 아래와 같다.
float horizontalInput = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * Time.deltaTime * speed * horizontalInput);
오른쪽이 Positive라고 했으므로 Vector3.right
를 단위 벡터로 사용하여 이동을 주었다.