유니티/유니티 C#

유니티 입력 처리 심화 - (2) 임베디드 방식

monstro 2024. 12. 10. 22:08
728x90
반응형

지난 포스트에서는 입력장치에서 직접 값을 읽어오는 다이렉트 방식의 Input System을 알아보았습니다.

이번 포스트에서는 Input Action을 통해 입력장치의 값을 읽어오는 임베디드 방식을 알아보겠습니다.

 

1) 임베디드 방식이란?

 

위와 같이 입력 장치에서 C# 스크립트로 입력값을 전달하되,

Input Action을 통해 입력값을 전달하는 방식입니다.

간단한 게임의 구조에서 사용할 수 있으며 Direct 방식에 비해서 입력을 자유롭게 설정할 수 있습니다.

 

InputAction의 경우 입력장치로부터 입력값InputAction.CallbackContext를 통해 전달받습니다.

그리고 입력장치로부터 입력방식은 다음의 3가지로 전달받게 됩니다.

1 - 1) Started

Action이 연결된 키를 처음 누르는 경우Started로 사용합니다.

Started와 연결된 콜백 함수수행됩니다.

 

1 - 2) Performed

InputValue가 변경되는 경우Performed로 사용합니다.

Performed와 연결된 콜백 함수수행됩니다.

 

1 - 3) Canceled

Action이 연결된 키를 떼는 경우Canceled로 사용합니다.

InputAction.CallbackContext 값디폴트 값으로 초기화합니다.

Canceled와 연결된 콜백 함수수행됩니다.

 

그리고 입력에 따라 실행되는 콜백 함수들은 각각의 입력방식에 이벤트로서 동작합니다.

그렇다면 실제 예제를 한번 알아보겠습니다.

 

2) 실제예제

public class EmbeddedWorkFlow : MonoBehaviour
{
    public InputAction jumpAction;
    public InputAction moveAction;
    private bool IsJumpPressed;
    private Vector2 MoveDir;

    public float speed;
    public Rigidbody2D rb;

    private void OnEnable()
    {
        // jumpAction에 이벤트로서 호출함 함수를 연결
        jumpAction.performed += Jump;
        jumpAction.canceled += StopJump;
        jumpAction.Enable();

        // moveAction에 이벤트로서 호출함 함수를 연결
        moveAction.performed += Move;
        moveAction.canceled += StopMove;
        moveAction.Enable();
    }

    private void OnDisable()
    {
        // jumpAction에 연결된 이벤트를 다시 없애줌
        jumpAction.performed -= Jump;
        jumpAction.canceled -= StopJump;
        jumpAction.Disable();

        // moveAction에 연결된 이벤트를 다시 없애줌
        moveAction.performed -= Move;
        moveAction.canceled -= StopMove;
        moveAction.Disable();
    }

    private void Start()
    {
        
    }

    private void Jump(InputAction.CallbackContext value)
    {
        IsJumpPressed = value.ReadValueAsButton();
        Debug.Log("Jump Performed and bool is " + IsJumpPressed);
    }

    private void StopJump(InputAction.CallbackContext value)
    {
        IsJumpPressed = value.ReadValueAsButton();
        Debug.Log("Jump canceled and bool is " + IsJumpPressed);
    }

    private void Move(InputAction.CallbackContext value)
    {
        MoveDir = value.ReadValue<Vector2>().normalized;
    }

    private void StopMove(InputAction.CallbackContext value)
    {
        MoveDir = value.ReadValue<Vector2>().normalized;
    }

    private void FixedUpdate()
    {
        rb.velocity = new Vector2(MoveDir.x * speed, MoveDir.y * speed);
    }
}

 

jumpAction과 moveAction은 각각 다음과 같이 설정되었습니다.

 

jumpAction에서 수행해야 하는 Jump와 StopJump

그리고 moveAction에서 수행해야 하는 Move와 StopMove를 이벤트로서 해당 InputAction에 연결하였습니다.

또한 InputAction의 경우 활성화와 비활성화를 수행해야 하므로

OnEnable과 OnDisable에서 각각 수행하도록 하였습니다.

 

이제 실행결과를 살펴보겠습니다.

 

 

위와 같이 입력이 임베디드 방식으로 잘 실행되는 것을 볼 수 있습니다.

728x90
반응형