시작
게임은 영상이나 음악이란 요소도 중요하지만, 영화나 다른 시각 매체와 큰 차이점을 두는 것은 바로 조작이다.
우리가 게임을 조작하기 위해서는 여러가지 것들을 이용할 수 있다.
PC게임이라면 키보드, 콘솔 게임이라면 게임패드, 모바일 게임이라면 터치UI 등등이 될 수 있다.
우리가 게임을 조작하는 것은 물리적인 조작 장치가 게임에 신호를 보내는 것이라고 할 수 있다.
이 조작을 위한 신호는 Input 시스템이 담당하고 있기에 우리는 Input 시스템을 어떻게 이용할 수 있는지에 대해 알아야한다.
Input System
게임 엔진에 대해 전문적이고 체계적으로 개발한 Unity는 그동안 입력에 관해 여러가지 시스템들을 도입하고 발전 시켰다.
그 결과 두 형태의 Input 시스템이 존재하는데, 각각 old system과 new system이다.
옛전 시스템이라 old system, 새로운 시스템이라 new system 인 것도 있지만 시스템들 이름이 실제로 old system과 new system이다.
이번 글에서는 old system에 대해서 알아볼 것이다.
Input Manager
old system의 경우 Unity엔진에 내장되어있다.
old system에 대해서 보려면 Input Manager를 봐야 하는데 Input Manager는 아래의 경로로 들어갈 수 있다.
우선은 Project Settings 페이지로 가보자.
Edit 탭에서 Project Settings를 누르면 새로운 창이 하나 나올 것이다.▼
그러면 오른쪽 탭에 Input Manager 항목이 있는데 여기서 old system에 대해서 볼 수 있다.
Input Manager 항목을 선택하면 Axes라고 토글이 하나 나온다. (Axes는 Axis의 복수형이다.)
Axis는 범위를 말하는데 여기서 범위는 정해진 무언가가 아니고 0부터 1, 1부터 100 모두 가능하다.▼
이를 열어서 Horizontal과 Vertical을 보면 Negative Button과 Positive Button이 있는데, 이것이 기본적으로 할당된 버튼을 의미한다.
그 외에 다른 것들도 엄청나게 많은데 여기서 다루지 않은 것들에 대해서는 아래의 공식 도큐먼트에서 어떤 역할을 맡고 있는지 자세하게 볼 수 있다.▼
잠시 Horizontal과 Vertical 토글을 닫고 아래를 조금 훑어보면 똑같은 토글이 하나씩 더 있는 것을 볼 수 있다.
아래의 중복된 토글들은 Unity의 실수가 아니라 게임패드용 Input 시스템이다.▼
old system 사용
그럼 이제 이 old system을 사용해보자.
old system의 특징
old system은 사용할 때 이름을 정확하게 알아야 한다는 단점이 있다.
old system에서 수평 축의 키를 사용하고 싶다고 하면 Horizontal에 붙여진 Name, "Horizontal"을 정확히 쳐야한다.
이름을 정확하게 쓰지 않으면 작동하지 않는데, 문제는 없는 이름을 써도 컴파일러에서 오류를 탐지할 수 없어서 곤란할 수 있다.
그래도 이름만 정확히 쓰면 그 외의 것들은 편하게 사용할 수 있다.▼
Input.GetAxis()
그럼 본격적으로 스크립트를 작성해보도록 해보자.
이번에 우리가 사용할 메소드는 Input의 `GetAxis()` 메소드이다.
`GetAxis()` 함수의 설명은 아래와 같다.
특정 Input Manager로 설정한 정보를, axisName 인수로 가져옵니다.
키보드와 조이스틱 입력값에 대해 -1에서 1까지의 값을 가집니다.
축이 마우스의 이동량으로 설정되는 경우, 마우스의 이동량은 축 감도를 곱하므로, -1 ... 1 범위에서는 없습니다.
차체 회전 시켜보기
그러면 함수를 사용해보자.
우선은 핸들을 얼마나 돌릴지를 결정하는 값을 `Update()` 함수 안에서 받아와 보자.
게임이 돌아가는 동안 키 입력이 감지되어야하기 때문에 `Start()`가 아닌 `Update()`에 넣어야한다. ▼
float steerAmount = Input.GetAixs("Horizontal");
// Horizontal 스펠링을 틀리면 작동하지 않는다. 주의해야한다.
이렇게 받아온 값을 Rotate 함수에 넣어준다. ▼
transform.Rotate(0, 0, -steerAmount);
//steerAmount를 Rotate의 세번째 매개변수(z값)에 넣는다.
변수 이름은 뭐가 되어도 상관 없지만, `GetAxis()` 명령문은 아래와 같이 `Update()` 함수 블럭 안에 있어야한다. ▼
실행을 해보면 차체가 잘 회전하는 것을 볼 수 있다. ▼
차체 전진, 후진 해보기
사실 회전하는 것은 크게 재밌지 않다.
진짜 달려야 재밌으니 바로 전진과 후진을 `GetAxis()`를 이용해 만들어보자.
앞의 회전과 같이 이동하는 값을 저장해 줄 변수를 하나 만든다.
전진과 후진은 위, 아래 키를 이용할 것이기 때문에 Vertical 시스템을 이용해야한다. ▼
float moveAmount = Input.GetAxis("Vertical");
//Vertical 스펠링을 틀리면 작동하지 않는다. 주의해야한다.
이렇게 받아온 값을 `Translate()`에 넣어준다. ▼
transform.Translate(0, moveAmount, 0);
//moveAmount를 Translate의 두번째 매개변수(y값)에 넣는다.
똑같이 `Update()`에 넣어줘야한다. ▼
실행을 해보면 엄청나게 빠른 속도로 차가 사라지는 것을 볼 수 있을 것이다.
이는 단위 정립을 제대로 안해줬기 때문이다.
`moveAmount`에 적절한 값을 곱해줘서 속도를 조절하면 조종하기에 적당한 속도가 나온다.▼
정리
- Input SystemOld와 New System이 있다.이 중 old 시스템을 먼저 봤는데, old 시스템은 axisName을 정확히 알고 있어야한다.
- `Input.GetAxis()` 1부터 1 사이의 값을 반환한다.허나 우리가 생각하는 단위와 일치한다는 보장이 없으므로 적절한 값을 곱해서 사용해야한다.
- 변수를 이용한 스크립팅이전까지는 값을 직접 넣은 하드코딩이었다면, 변수를 이용하면 프로그램 실행 도중에 값을 바꿀 수 있게 된다.
'Develop > Unity' 카테고리의 다른 글
Unity2D: Start와 Update (0) | 2024.03.01 |
---|---|
[Unity2D] Object와 Sprite (0) | 2024.02.22 |
[Unity2D] 게임 디자인 (0) | 2024.02.22 |
[Unity2D] unity와 C#, VSCode 설정(macOS, M1) (0) | 2024.02.22 |
[Unity2D] 기초에 앞서 (0) | 2024.02.22 |