내일배움캠프 TIL

내일배움캠프 23일차 TIL "Input System을 사용하는 여러 방법"

Jooglorystar 2024. 10. 16. 22:49

 

 

Input System을 이용하는 방법은 크게 4가지가 존재한다.

 

 

1. 다이렉트 방식

 

코드내에서 직접 입력장치를 연결하고, 입력키 까지 설정하는 다이렉트 방식이 있다.

다음과 같은 방식으로 구현할 수 있다.

 

private Keyboard keyboard;

private void Awake()
{
    keyboard = Keyboard.current;
}

private void Update()
{
    if (keyboard.aKey.isPressed)
    {

    }
    else if (keyboard.dKey.isPressed)
    {

    }
    else if (keyboard.wKey.isPressed)
    {

    }
    else if(keyboard.sKey.isPressed)
    {

    }
}

 

input system에 있는 키보드 클래스에 현재 사용중인 키보드를 할당하고,

그 키보드의 입력 받은 키에 따라 특정 기능을 수행하게 할 수 있다.

isPressed 위치에는 다음과 같은 키워드들이 올 수 있다.

 

isPressed

는 해당 버튼을 누르고 있는 동안에 true를 반환한다.

 

wasPressedThisFrame

는 해당 버튼을 누른 그 순간만 true를 반환한다.

예를 들면 이동버튼을 만든다고 했을 때, isPressed를 사용할 경우 꾹 누르기만 해도 이동이 원활하게 되지만,

wasPressedThisFrame을 사용할 경우 꾹 누르면 한번 입력 받은 만큼만 이동하며, 그보다 더 많이 이동하고 싶을 경우 연타를 해야한다.

 

wasReleasedThisFrame

는 버튼을 누른 것이 끝난 순간에 true값을 반환한다.

 

 

이처럼 직접 입력장치를 연결하고, 입력방식도 직접 설정하는 방식을 다이렉트 방식이라고 한다.

 

2. 임베디드 방식

 

코드에 다음과 같이 추가할 경우 해당 코드 인스펙터창에 키바인딩을 할 수 있는 창이 생성된다.

 

[SerializeField] private InputAction _action;

 

키 바인딩이 끝난 모습

 

다음과 같이 이용할 수 있다.

public float dir;

public InputAction moveAction;

private void OnEnable()
{
    moveAction.performed += PlayerMove;
    moveAction.canceled += PlyerStop;

    moveAction.Enable();
}

private void OnDisable()
{
    moveAction.Disable();

    moveAction.performed -= PlayerMove;
    moveAction.canceled -= PlyerStop;
}

void PlayerMove(InputAction.CallbackContext value)
{
    dir = value.ReadValue<float>();
    CallMoveEvent(new Vector2 (dir, 0));
}

void PlyerStop(InputAction.CallbackContext value)
{
    dir = 0f;
    CallMoveEvent(new Vector2(dir, 0));
}

 

해당 코드로 A키를 입력하면 dir가 -1이 되고, D키를 입력하면 dir가 +1이 된다.

그 입력은 InputAction.CallbackContext 형태로 입력되며, ReadValue<>를 통해 그 값을 원하는 형태로 받아와야한다.

해당 코드를 사용하면 캐릭터를 좌 우로 움직일 수 있게 되었다.

 

이처럼 인스펙터 창 안에서 키 바인딩을 하므로, 인베디드 방식이라고 부른다.

 

 

3. 액션 애셋 방식

 

Input Action을 애셋 형태로 만드는 방식이다. 

 

그동안 Input System을 이용할 때 사용한 방식이다.

 

생성된 애셋에서 액션 맵과 키 바인딩까지 모두 마칠 수 있다.

 

단, 주의할 점은 값을 받는 방식이다.

 

public void OnMove(InputValue value)
{
    Vector2 moveInput = value.Get<Vector2>().normalized;
    CallMoveEvent(moveInput);
}

 

입력을 원하는 값으로 받기 위해서는 value.Get<Vector2>() 와 같은 방법을 써야한다.

임베디드 방식과 다름을 유의해야한다.

 

 

 

4. C# 클래스 생성 방식

 

 

생성한 액션 애셋에서 Generate C# Class를 체크하고 Apply하면 해당 액션 애셋에 맞는 스크립트가 생성된다.

 

생성된 스크립트 일부

 

 

해당 스크립트를 이용해 입력시스템을 구현할 수도 있다.

 

 

 

이처럼 Input System을 이용하는데는 여러 방식이 존재하며, 필요한 방식에 따라 적절하게 이용할 수 있다.