레트로의 유니티 게임 프로그래밍 에센스 - 6.8

Cosmos·2023년 4월 5일
0

학습 매체 : 책

책이름 : 레트로의 유니티 게임 프로그래밍 에센스

저자 : 이제민


본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.


6.8 입력 매니저


  • Input.GetAxis( ) 메서드로 Input.GetKey( ) 메서드를 대체했다. 여기서 다음과 같은 의문이 들 수 있다.
  1. GetAxis( ) 메서드에 입력한 Horizontal 축과 Vertical 축은 무엇이며 왜 사용하는가?
  2. GetAxis( ) 메서드의 출력값은 어째서 true, false가 아닌 숫자인가?
  • 정답부터 말하면 다음과 같다.

1번 : 입력키 커스터마이제이션을 구현하기 위해
2번 : 조이스틱 같은 다양한 입력 장치에 대응하기 위해


6.8.1 GetAxis( ) 메서드와 입력축

if (Input.GetKey(KeyCode.UpArrow) == true)
{
	playerRigidbody.AddForce(0f, 0f, speed);
}
  • 이렇게 특정 키를 지목하는 방식은 조작 키를 실시간으로 변경할 수 없는 단점이 있다. 위 예시는 앞쪽으로 움직일 때 위쪽 방향키를 사용한다. 이것을 W 키로 변경하려면 코드 자체를 다음과 같이 수정해야 한다.
Input.GetKey(KeyCode.UpArrow) -> Input.GetKey(KeyCode.W)
  • 조작 키가 바뀔 때마다 이런 식으로 매번 코드를 변경하고 다시 빌드할 순 없다. 따라서 '입력 이름'을 거쳐 가는 방식을 사용한다.

6.8.2 입력 이름

  • 누구나 한 번쯤 게임의 조작 키를 변경해본 경험이 있다. 대부분의 조작 키 설정 창은 '기능의 이름'과 '매핑된 키' 쌍으로 구성된다.

예시

  • 발사 <=> [마우스 왼쪽 버튼]
  • 점프 <=> [스페이스바]
  • 설정 창에서 다음과 같이 매핑된 키를 마음대로 변경할 수 있다.
  • 발사 <=> [마우스 오른쪽 버튼]
  • 점프 <=> [엔터]
  • 이것이 가능한 이유는 실체 총을 발사하는 코드에서는 '마우스 왼쪽 버튼'처럼 입력 장치의 구체적인 식별자를 사용하지 않기 때문이다. 그 대신 '발사'라는 입력 이름을 통해 입력을 감지한다.
if (마우스 왼쪽 버튼을 누름)
{
	// 총 발사
}
  • 위와 같은 코드는 게임 도중에 발사 키를 '마우스 오른쪽 버튼'으로 바꿀 수 없다.
if ("발사"에 대응되는 버튼을 누름)
{
	// 총 발사
}
  • 하지만, 위 방식처럼 '발사'라는 입력 이름에 대응되는 버튼을 감지하게 하면 나중에 조작 키를 바꿀 수 있다.

  • 중요한 점은 구체적으로 어떤 버튼을 감지할 것인지 명시하지 않는다는 것이다.

  • 정리하면 다음과 같은 식으로 연결된 구조다.

코드 (실제 발사 기능) <=> 입력 이름 ("발사") <=> 입력 장치 (마우스 왼쪽 버튼)

  • 만약 총 발사에 마우스 오른쪽 버튼을 사용하고 싶다면 "발사"라는 입력 이름에 대응하는 버튼을 변경한다. 코드는 수정할 필요가 없다.

코드 (실제 발사 기능) <=> 입력 이름 ("발사") <=> 입력 장치 (마우스 오른쪽 버튼)

  • 유니티에서 사용하는 이 바로 위에서 설명한 입력 이름이다. GetAxis( ) 메서드에서 사용한 Horizontal과 Vertical도 축이다.

  • 축은 축에 대응하는 버튼을 가진다. 따라서 축을 사용하면 사용할 입력키를 직접 명시하지 않아도 된다. 축은 유니티 입력 매니저에서 관리한다.


6.8.3 입력 매니저 설정 창

  • 입력 매니저에서 미리 설정된 축들을 확인해보자.

  • 유니티 상단 메뉴 > Edit > Project Settings

  • Input Manager > Axes 리스트 펼치기 > 미리 설정되어 있는 입력 축들이 표시됨

  • Horizontal 축 설정

  • Horizontal에 대응하는 입력 버튼들이 미리 설정된 것을 확인할 수 있다.

음의 방향 버튼(Negative Button) : left(왼쪽 방향키)

양의 방향 버튼(Positive Button) : right(오른쪽 방향키)

음의 방향 보조 버튼(Alt Negative Button) : a

음의 방향 보조 버튼(Alt Positive Button) : d

  • Vertical 축도 살펴보자.

음의 방향 버튼(Negative Button) : down(아래쪽 방향키)

양의 방향 버튼(Positive Button) : up(위쪽 방향키)

음의 방향 보조 버튼(Alt Negative Button) : s

음의 방향 보조 버튼(Alt Positive Button) : w

  • 정리하면 Input.GetAxis("Horizontal")이 실행될 때, 다음 과정으로 입력값이 감지된다.
  1. 입력 매니저에서 Horizontal 축을 찾음
  2. Horizontal 축에 대응되는 버튼(← , a, →, d)들로 현재 입력을 검사
  3. 감지된 입력값 반환
  • 기존 Horizontal과 Vertical 축의 설정을 변경하거나 Axes에 사용자만의 새로운 축을 추가하여 자신만의 입력 설정을 만들 수 있다.

  • 다만 유니티의 기본 입력축들만으로 닷지를 완성하는 데 충분하기 때문에 닷지 프로젝트에서는 입력 매니저를 수정하지 않을 것이다.


6.8.4 멀티플랫폼 입력 지원

  • 잘 살펴보면 Horizontal 축과 Vertical 축이 각각 하나씩 더 있다.

  • 두 번째 Horizontal 축과 Vertical 축을 펼쳐보면 버튼 필드가 비어 있다. 대신 Type이 Joystick Axis로 설정되어 있다.

  • 두 번째 Horizontal 축과 Vertical 축은 엑스박스(Xbox)와 같은 콘솔 게임기 게임 패드의 조이스틱(아날로그 스틱)에 대응된다.

  • 즉, 별다른 처리를 추가하지 않아도 Input.GetAxis("Horizontal")을 사용했을 때 키보드와 게임 패드 모두에 대응할 수 있다.

  • 입력축을 사용하면 다양한 기기의 입력을 코드 한 줄로 쉽게 대응할 수 있다.


6.8.5 입력을 숫자로 받는 이유

  • 입력축은 아날로그 스틱에도 대응된다는 사실에서 입력값을 true나 false가 아닌 숫자로 변환하는 이유를 알 수 있다.

  • 키보드의 키는 눌렀을 때 true, 누르지 않았을 때 false로 단순하게 구분할 수 있다. 하지만 게임 패드의 아날로그 스틱은 '살짝'미는 것이 가능하다.

  • Input.GetAxis("Horizontal")은 키보드뿐만 아니라 게임 패드 스틱의 수평 방향에도 대응한다.

  • 게임 패드의 스틱을 다음 방향으로 '완전히' 밀면 다음과 같이 입력값이 감지된다.

스틱을 왼쪽으로 완전히 밀기 : -1.0

스틱을 가만히 내버려 두기 : 0

스틱을 오른쪽으로 완전히 밀기 : +1.0

  • 스틱은 '살짝' 미는 것도 가능하다. 만약 스틱을 왼쪽으로 '살짝' 밀면 -1.0과 0 사이의 값(예를 들면 -0.5)이 나온다.

  • 입력을 숫자로 받으면 스틱을 '얼마나' 밀었는지까지 감지할 수 있다. 따라서 스틱을 '살짝' 또는 '강하게' 미는 것까지 구별할 수 있다.

  • 다음 장에서는 플레이어를 공격하는 탄알과 탄알 생성기를 만들 계획이다.

다음 강의에서 계속~

profile
게임 개발을 목적으로 공부하고 있는 대학생입니다.

0개의 댓글