유니티/유니티 C#

유니티 입력 처리 심화 - (1) Direct 방식

monstro 2024. 12. 9. 21:28
728x90
반응형

C# 기반의 게임엔진인 Unity에서는

기존의 Input Maanger와 새로운 방식의 Input System을 사용하여 입력을 처리합니다.

이 둘의 차이점에 대해서는 이전의 포스트에서 다뤄보았습니다.

 

https://monstrosite.tistory.com/42

 

Input Manager와 Input System

유니티에서는 두 개의 입력 시스템을 제공합니다.구형 입력 시스템인 Input Manager와 신형 입력 시스템인 Input System입니다. 사용자의 키 변경에 대응하기 위해 개발된 Input System은 기존의 Input Manage

monstrosite.tistory.com

 

이번 포스트에서는 Input System을 조금 더 쪼개어 깊게 다뤄보고

각 방식의 차이점에 대해서도 알아보겠습니다.

 

1) Input System

Input System을 통한 입력을 처리하는 경우는 크게 2가지로 쪼개어 구분할 수 있습니다.

1 - 1) 간단한 게임의 경우에서 입력 장치를 통해 직접적으로 값을 가져오는 방법

 

1 - 2) 간단한 게임의 경우에서 Input Action을 통해 입력 장치로 입력한 값을 가져오는 방법

 

1 - 3) 규모가 있는 게임의 경우에서 Action Asset을 사용하는 방법

 

1 - 4) 규모가 있는 게임의 경우에서 Action AssetPlayerInputComponent를 사용하는 방법

 

이번 포스트에서는 1 - 1의 방법인 직접적으로 값을 가져오는 방법

즉, Direct 방식을 통해 입력이 이뤄지는 것과 입력을 수행하는 방법을 알아보겠습니다.

 

2) Direct 방식의 입력 처리

public class DirectSyntax : MonoBehaviour
{
    private void Update()
    {
        Keyboard myKeyboard = Keyboard.current;
        Mouse myMouse = Mouse.current;

        if (myKeyboard != null)
        {
            // 이번 프레임에서 눌렸다면
            if (myKeyboard.spaceKey.wasPressedThisFrame)
                Debug.Log("wasPressedThisFrame");
            // 이번 프레임에서 눌렸다 떼졌다면
            if (myKeyboard.spaceKey.wasReleasedThisFrame)
                Debug.Log("wasReleasesThisFrame");
            // 키가 눌려지고 있다면
            if (myKeyboard.spaceKey.isPressed)
                Debug.Log("isPressed");
        }

        if (myMouse != null)
        {
            // 마우스 클릭
            if (myMouse.leftButton.wasPressedThisFrame)
                Debug.Log("Mouse Clicked");
            // 마우스를 위로 스크롤링
            if (myMouse.scroll.ReadValue().y > 0)
                Debug.Log("Mouse Scrolling Up");
        }
    }
}

 

기존의 Input Manager와는 다르게 입력을 3가지 방식으로 쪼개어 사용합니다.

각각 wasPressedThisFrame, wasReleasedThisFrame, isPressed의 3가지인데

이번 프레임에서 눌렀는지, 이번 프레임에서 뗐는지, 눌려지고 있는지를 판단합니다.

 

그것뿐만이 아니라 ReadValue 함수를 통해 입력 장치로 수행한 입력의 값도 반환할 수 있습니다.

수행 결과를 살펴보면 다음과 같습니다.

 

 

 

3) Direct 방식을 통한 입력 처리로 이동하기

public class DirectMove : MonoBehaviour
{
    [SerializeField]
    private float Speed;
    [SerializeField]
    private Rigidbody2D rb;

    private float valueX;
    private float valueY;
    private Vector2 Direction;

    void Start()
    {
        
    }

    void Update()
    {
        valueX = 0;
        valueY = 0;

        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            // a 키를 누르면 왼쪽으로
            if (keyboard.aKey.isPressed)
                valueX = -1;
            // d 키를 누르면 오른쪽으로
            if (keyboard.dKey.isPressed)
                valueX = 1;
            // a 와 d 키를 동시에 누르면 x축으로의 움직임을 막음
            if (keyboard.aKey.isPressed && keyboard.dKey.isPressed)
                valueX = 0;

            // s 키를 누르면 아래쪽으로
            if (keyboard.sKey.isPressed)
                valueY = -1;
            // w 키를 누르면 위쪽으로
            if (keyboard.wKey.isPressed)
                valueY = 1;
            // s 와 w 키를 동시에 누르면 y축으로의 움직임을 막음
            if (keyboard.sKey.isPressed && keyboard.wKey.isPressed)
                valueY = 0;
        }


        // 최종 결정된 valueX와 valueY를 값으로 삼는 Direction 설정
        Direction = new Vector2(valueX, valueY);
    }

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

 

Update 함수에서 Direct 방식으로 입력값을 받아와서

FixedUpdate 함수에서 입력값을 토대로 움직임을 수행하게 됩니다.

실행결과는 다음과 같습니다.

 

 

문제없이 움직임이 수행되는 것을 볼 수 있습니다.

728x90
반응형