유니티에서 마우스나 키보드 입력을 어떻게 처리하는가?
아마 Input 클래스의 GetKey(KeyCode key), GetMouseButton(int button)와 같은 함수를
Update문에서 계속 체크하는 방식을 가장 많이 사용할 것이다.
하지만, 이러한 방식은 타겟 플랫폼이 달라질 때마다,
코드를 수정해야한다는 단점이 있다.
유니티에서는 입력 처리를 최적화하고, 통합 관리할 수 있는
InputSystem 패키지를 제공한다.
사용 방법에 대해 간단히 알아보도록 하자.
패키지 설치
일단, Package Manager에서 Input System을 설치해주자.
Yes 버튼을 눌러 프로젝트를 다시 시작한다.
에셋 생성
Create/Input Actions를 클릭하여 Input Action Asset을 생성해준다.
에셋을 열어 "Action Maps"과 "Actions"를 등록해준다.
위 예시에서는 "Player" 조작을 관리할 Map을 만들고,
W 또는 Up Arrow를 눌렀을 때, "Move Forward" Action이 실행되도록 구성했다.
스크립트 작성
using UnityEngine;
using UnityEngine.InputSystem; // InputSystem 네임스페이스
public class InputActionExample : MonoBehaviour
{
[Header("Asset")]
public InputActionAsset actionAsset; // 생성한 Input Action Asset
[Header("Action")]
public InputActionReference moveForwardAction; // "Move Forward" Action
//__________________________________________________________________________ Enable & Disable
private void OnEnable()
{
actionAsset.Enable(); // Asset을 활성화해야 Action이 실행된다.
moveForwardAction.action.performed += onMoveForwardPerformed;
moveForwardAction.action.canceled += onMoveForwardCanceled;
}
private void OnDisable()
{
actionAsset.Disable(); // Asset을 비활성화하면 Action이 실행되지 않는다.
moveForwardAction.action.performed -= onMoveForwardPerformed;
moveForwardAction.action.canceled -= onMoveForwardCanceled;
}
//__________________________________________________________________________ Event
private void onMoveForwardPerformed(InputAction.CallbackContext obj) // Action이 실행될 때
{
Debug.Log("Move Forward | Performed");
}
private void onMoveForwardCanceled(InputAction.CallbackContext obj) // Action이 종료될 때
{
Debug.Log("Move Forward | Canceled");
}
}
우선, 생성한 Input Action Asset을 활성화해야 Action이 실행되므로,
InputActionAsset.Enable() 함수를 실행한다.
그리고, Action이 실행될 때(performed)의 이벤트와
종료될 때(canceled)의 이벤트를 각각 등록해준다.
public 변수들은 위와 같이 할당해주자.
결과
잘 작동하는 것을 볼 수 있다.
+ 키 동시 입력
하나의 키가 아닌, 둘 이상의 키 입력도 처리할 수 있다.
+ Value 타입
Button 타입 뿐만 아니라 Value 타입을 지원한다.
※ Vector2, Vector3, Axis, Quaternion, Integer, Delta, Touch, ...
using UnityEngine;
using UnityEngine.InputSystem;
public class InputActionExample : MonoBehaviour
{
[Header("Asset")]
public InputActionAsset actionAsset;
[Header("Action")]
public InputActionReference vector2Action;
private void OnEnable()
{
actionAsset.Enable();
vector2Action.action.performed += onVector2Performed;
}
private void onVector2Performed(InputAction.CallbackContext obj)
{
Vector2 vec2 = obj.ReadValue<Vector2>();
Debug.Log(vec2);
}
}
최근에 데모 및 샘플 프로젝트들을 살펴보면,
InputSystem을 활용한 사례가 많다.
유니티에서도 강조하는 만큼, 앞으로의 프로젝트에 지속해서 활용할 듯 싶다.
'[Unity]' 카테고리의 다른 글
[Unity] URP 스텐실(Stencil) 활용하기 (1) | 2024.09.05 |
---|---|
[Unity] 오브젝트 풀링을 간단히 구현해보자(ObjectPool) (38) | 2024.05.24 |
[Unity] 코루틴을 대체하자(UniTask) (43) | 2024.05.15 |
[Unity] 선을 그리는 UI를 만들어보자 (60) | 2024.04.28 |
[Unity] UI 모양을 내 맘대로 바꿔보자(VertexHelper) (50) | 2024.04.21 |
댓글