[Unity] 두 개 키 동시에 입력 받기

박민주·2022년 1월 15일
1

Unity

목록 보기
6/40
post-thumbnail

두 개의 키 입력을 동시에 받아야 할 때,
처음에는 Update문 안에서 아래와 같이 조건을 주었다

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
        {
            Debug.Log("LEFT ARROW & RIGHT ARROW");
        }
    }

근데 이게 좀 빡빡한 감이 있다
한 프레임 안에서 정말 정확하게 두 키가 동시에 눌려야 하기 때문이다

보통 사람이 두 개 키를 동시에 누른다고 하면 어느 정도는 타이밍 차이가 있을 수 밖에 없다
어느 정도 러프함이 필요했다

그래서 조금 더 인풋에 대한 러프함을 주기 위해 한 쪽을 GetKey로 받아주었다

    void Update()
    {
        if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
        {
        
        }
    }

그리고 내가 구현하려는 기능의 경우 어떤 키가 먼저 눌리든 상관이 없었기에
else if 로 한 번 더 입력이 처리될 수 있는 기회를 주도록 구현했다

    void Update()
    {
        if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
        {
            Attack();
        }
        else if(Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow))
        {
            Attack();
        }
    }

Test

나의 경우에는 리듬게임에서 쓰려는건데
위 예시에서는 KeyCode.LeftArrow와 RightArrow만 있었지만,
만약 LeftArrow와 UpArrow 조합도 동시에 필요하다면 인식이 잘 될지 궁금했다
즉, LeftArrow로 시작되는 조합의 키가 여러 개여도 잘 동작할 것인가!

결론은 잘 된다

1. LeftArrow로 시작하는 입력이 하나인 경우

실제로 아래와 같이 코드를 쓰고 실행해보면
먼저 입력된 키에 대한 조건문으로 들어가게 된다

    void Update()
    {
        if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
        {
            Debug.Log("Track 1 & 2");
        }
        else if(Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow))
        {
            Debug.Log("Track 2 & 1");
        }
    }

2. LeftArrow로 시작하는 입력이 두 개인 경우

    void Update()
    {
        // Track Test
        // 1 & 2
        if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
        {
            Debug.Log("Track 1 & 2");
        }
        else if(Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow))
        {
            Debug.Log("Track 2 & 1");
        }

        if (Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.UpArrow))
        {
            Debug.Log("Track 1 & 3");
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.UpArrow))
        {
            Debug.Log("Track 3 & 1");
        }
    }

3. LeftArrow로 시작하는 입력이 세 개인 경우

    void Update()
    {
        // Track Test
        if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
        {
            Debug.Log("Track 1 & 2");
        }
        else if(Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow))
        {
            Debug.Log("Track 2 & 1");
        }

        if (Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.UpArrow))
        {
            Debug.Log("Track 1 & 3");
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.UpArrow))
        {
            Debug.Log("Track 3 & 1");
        }

        if (Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.DownArrow))
        {
            Debug.Log("Track 1 & 4");
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.DownArrow))
        {
            Debug.Log("Track 4 & 1");
        }
    }

profile
Game Programmer

0개의 댓글