Hya 개발스토리

[유니티 2022.3.ver] 스크립트에서 키보드 조작키 접근 방법(GetAxis(), GetButton(), GetKey()) 본문

Unity/개념정리

[유니티 2022.3.ver] 스크립트에서 키보드 조작키 접근 방법(GetAxis(), GetButton(), GetKey())

Hya68 2024. 7. 5. 11:58

스크립트에서 키보드 조작키 접근하는 방법

목차


 

GetAxis(), GetButton(), GetKey()

 

키보드 조작키 접근 방법으로는 크게

Input 클래스의 GetAxis(), GetButton(), GetKey()로 3가지가 있습니다.

(Input 클래스 : 사용자 입력 메서드를 모아둔 클래스)

        // 방향키 위쪽을 누르면
        if (Input.GetKey(KeyCode.UpArrow)) {
 
            float verticalAxis = Input.GetAxis("Vertical");
            float verticalAxisRaw = Input.GetAxisRaw("Vertical");
            bool verticalButton = Input.GetButton("Vertical");
            bool verticalButtonDown = Input.GetButtonDown("Vertical");
            bool verticalButtonUp = Input.GetButtonUp("Vertical");
            bool verticalKey = Input.GetKey("up");
            bool verticalKeyDown = Input.GetKeyDown(KeyCode.UpArrow);
            bool verticalKeyUp = Input.GetKeyUp(KeyCode.UpArrow);

            Debug.Log("GetAxis : " + verticalAxis); // -1 ~ 1 사이 실수
            Debug.Log("GetAxisRaw : " + verticalAxisRaw); // 1
            Debug.Log("GetButton : " + verticalButton); // True
            Debug.Log("GetButtonDown : " + verticalButtonDown); // True
            Debug.Log("GetButtonUp : " + verticalButtonUp); // False
            Debug.Log("GetKey : " + verticalKey); // True
            Debug.Log("GetKeyDown : " + verticalKeyDown); // True
            Debug.Log("GetKeyUp : " + verticalKeyUp); // False
 
        } else {
 
            float verticalAxis = Input.GetAxis("Vertical");
            float verticalAxisRaw = Input.GetAxisRaw("Vertical");
            bool verticalButton = Input.GetButton("Vertical");
            bool verticalButtonDown = Input.GetButtonDown("Vertical");
            bool verticalButtonUp = Input.GetButtonUp("Vertical");
            bool verticalKey = Input.GetKey(KeyCode.UpArrow);
            bool verticalKeyDown = Input.GetKeyDown(KeyCode.UpArrow);
            bool verticalKeyUp = Input.GetKeyUp(KeyCode.UpArrow);

            Debug.Log("GetAxis : " + verticalAxis); // 0
            Debug.Log("GetAxisRaw : " + verticalAxisRaw); // 0
            Debug.Log("GetButton : " + verticalButton); // False
            Debug.Log("GetButtonDown : " + verticalButtonDown); // False
            Debug.Log("GetButtonUp : " + verticalButtonUp); // False
            Debug.Log("GetKey : " + verticalKey); // False
            Debug.Log("GetKeyDown : " + verticalKeyDown); // False
            Debug.Log("GetKeyUp : " + verticalKeyUp); // False
 
        }

GetAxis()는 결과값을 실수 타입(float)으로 반환하고

나머지 GetButton()과 GetKey()는 논리 타입(bool)으로 반환합니다.

 

GetAxis()의 매개변수에는 속성 이름으로 적고,

GetButton()과 GetKey()의 매개변수에는 KeyCode로 접근하거나 키 이름으로 적습니다.

 


 

GetAxis() 값 확인

GetAxis() 값 확인

GetAxis()는 -1~1 사이의 실수를 반환합니다.

오른쪽 로그 사진은 방향키 위 버튼, 아래 버튼을 차례로 누른 결과입니다.

 

위 버튼(양의 방향 버튼)을 누르면 0보다 크고 1보다 작은 값을 반환합니다.

아래 버튼(음의 방향 버튼)을 누르면 -1보다 크고 0보다 작은 값을 반환합니다.

버튼을 누르지 않으면 0을 반환합니다.

 

GetAxisAraw()는 GetAxis()와 같은 기능이지만 반환값이 -1, 0, 1로 고정되어 있습니다.

 


 

GetButton(), GetButtonDown(), GetButtonUp() 차이

GetButton(), GetButtonDown(), GetButtonUp() 차이

GetButton()은 해당 버튼을 누르고 있는 동안 true를 반환합니다.

GetButtonDown()은 해당 버튼을 눌렀을 때 true를 반환합니다.

GetButtonUp()은 해당 버튼을 떼었을 때 true를 반환합니다.

 

이는 GetKey(), GetKeyDown(), GetKeyUp()에도 동일하게 적용됩니다.


그러면 아래에서는 왜 GetButtonUP()과 GetKeyUp()이 False일까요.

그 이유는 위의 조건문 때문입니다.

해당 조건문은 버튼을 누른 상태가 전제가 되어야 로그값이 나오는데

-Up() 메서드 같은 경우에는 떼어야 true가 반환됩니다.

 

따라서 버튼은 뗀 순간 조건문이 적용이 되지 않기 때문에

true인 -Up() 메서드는 로그에 출력되지 않습니다.

 


 

KeyCode

KeyCode 자동완성 및 값

KeyCode는 GetKey()의 매개변수로 사용할 수 있는 실제 키 메서드입니다.

 

오른쪽 사진처럼 실제 KeyCode 메서드를 보면 각 변수가 정수로 초기화되어 있습니다.

따라서 KeyCode 변수는 int 타입으로

GetAxis()나 GetButton()의 매개변수로는 사용할 수 없습니다.

 

많이 사용하는 방향키는 UpArrow, DownArrow, RightArrow, LeftArrow이며

일반 w, a, s, d 키는 그대로 W, A, S, D 입니다.

 

더 많은 KeyCode 종류는 아래 링크를 확인해주세요.

https://docs.unity3d.com/kr/2022.3/ScriptReference/KeyCode.html

 

KeyCode - Unity 스크립팅 API

Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard. If "Use Physical Keys" is enabled in Input Manager settings, these map directly to a physical key on the keyboard. If "Use Physical Keys" is disabled these map to la

docs.unity3d.com

 


 

근데 실제로 개발을 하다 보면

키보드를 한 번 눌렀는데 콘솔창에 나타나는

GetAxis(), GetButton(), GetKey()  로그는 여러 개가 나옵니다.

 

그 이유는 컴퓨터의 작업 처리는 사람의 속도보다 훨씬 빠르기 때문입니다.

우리는 한 번 누른 것 같지만 컴퓨터는 그 잠깐 눌렀다 뗀 시간 동안에도

버튼을 누른 상태로 인식하여 처리하기 때문에

누르고 있는 동안 출력되는 로그는 생각하는 것보다 여러 번 나오게 됩니다.

 


총정리

아래는 위의 내용들을 정리한 표입니다.

메서드 매개변수
(매개변수타입)
반환타입 반환값
GetAxis()  축 이름
(string)
float -1 < 실수 < 0 : 속성의 음의 방향 버튼
0 : 아무것도 누르지 않음
0 < 실수 < 1 : 속성의 양의 방향 버튼
GetAxisRaw() -1 : 속성의 음의 방향 버튼
0 : 아무것도 누르지 않음
1 : 속성의 양의 방향 버튼
GetButton() bool True : 해당 버튼을 누르고 있음
False : 해당 버튼을 누르고 있지 않음
GetButtonDown() True : 해당 버튼을 눌렀음
False : 해당 버튼을 누르지 않았음
GetButtonUp() True : 해당 버튼을 떼었음
False : 해당 버튼을 떼지 않았음 
GetKey() 실제 키 이름 /
KeyCode 변수
(string / int)
bool True : 해당 버튼을 누르고 있음
False : 해당 버튼을 누르고 있지 않음
GetKeyDown() True : 해당 버튼을 눌렀음
False : 해당 버튼을 누르지 않았음
GetKeyUp() True : 해당 버튼을 떼었음
False : 해당 버튼을 떼지 않았음 

 

 

이외의 조이스틱, 마우스 등을 다루는 함수는 아래 공식 링크를 확인해주세요.

 

UnityEngine.Input - Unity 스크립팅 API

Interface into the Input system.

docs.unity3d.com

 

 

잘못된 정보가 있으면 댓글로 피드백 부탁드립니다.

 감사합니다:)