유니티 기초 강좌: 키보드/마우스의 입력 신호 감지

유니티(Unity)는 게임 개발을 위한 강력한 엔진으로, 다양한 플랫폼에서의 게임 개발을 지원합니다.
게임의 입력 처리 시스템은 플레이어와 상호작용하는 데 필수적이며, 키보드와 마우스 입력을 통해 플레이어의 명령을 인식하는 방법을 배우는 것은 매우 중요합니다.
본 강좌에서는 유니티에서 키보드와 마우스의 입력 신호를 감지하는 방법에 대해 상세히 설명하겠습니다.
이를 통해 기본적인 사용자 입력을 처리하는 방법을 습득하고, 이를 바탕으로 게임의 다양한 기능을 구현할 수 있습니다.

1. 유니티 입력 시스템 개요

유니티는 기본 입력 시스템을 제공하여 개발자가 쉽게 입력을 처리할 수 있도록 돕습니다.
입력 시스템은 키보드, 마우스, 게임패드 등 다양한 장치로부터의 입력을 수집하여 이를 명령으로 변환합니다.

유니티의 입력 흐름은 다음과 같습니다:

  • 입력 이벤트 감지: 사용자가 입력 장치를 사용하여 명령을 보냅니다.
  • 입력 처리: 이 입력 이벤트는 유니티의 입력 처리 시스템에 의해 감지됩니다.
  • 게임 오브젝트와 상호작용: 입력 이벤트를 통해 게임 내의 오브젝트와 상호작용하게 됩니다.

2. 키보드 입력 감지

유니티에서는 기본적으로 Input 클래스를 사용하여 키보드 입력을 감지합니다. 이 클래스는 다양한 메서드를 제공하여 특정 키가 눌렸는지, 지속적으로 눌려져 있는지 여부를 확인할 수 있습니다.
주요 메서드는 다음과 같습니다:

  • Input.GetKey(KeyCode): 특정 키가 눌리고 있는지 감지합니다.
  • Input.GetKeyDown(KeyCode): 특정 키가 처음 눌린 순간을 감지합니다.
  • Input.GetKeyUp(KeyCode): 특정 키가 처음으로 눌렸다가 떼어진 순간을 감지합니다.

2.1 키보드 입력 예제

다음은 키보드 입력을 감지하는 간단한 스크립트 예제입니다. 이 스크립트는 특정 키가 눌렸을 때 콘솔에 메시지를 출력합니다.

using UnityEngine;

public class KeyboardInputExample : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            Debug.Log("W 키가 눌렸습니다.");
        }
        if (Input.GetKeyUp(KeyCode.W))
        {
            Debug.Log("W 키에서 손을 뗐습니다.");
        }
        if (Input.GetKey(KeyCode.S))
        {
            Debug.Log("S 키가 눌려지고 있습니다.");
        }
    }
}

2.2 키 입력 반응

키 입력에 반응하여 플레이어 오브젝트가 이동하는 예시를 추가합니다.
아래의 코드는 W, A, S, D 키를 사용하여 플레이어 캐릭터를 움직입니다.

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;

    void Update()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        transform.Translate(movement * moveSpeed * Time.deltaTime);
    }
}

3. 마우스 입력 감지

마우스 입력은 유니티에서 더 다양한 형태로 사용할 수 있으며, 클릭 감지, 마우스 이동, 스크롤 등을 처리할 수 있습니다.
마우스 입력을 감지하는 가장 기본적인 방법은 Input.mousePositionInput.GetMouseButton 메서드를 사용하는 것입니다.

3.1 마우스 클릭 감지

마우스 클릭을 감지하려면 Input.GetMouseButton(int button)를 사용할 수 있습니다. button 인자는 0(왼쪽 버튼), 1(중간 버튼), 2(오른쪽 버튼)을 받습니다.

using UnityEngine;

public class MouseClickExample : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("왼쪽 마우스 버튼이 클릭되었습니다.");
        }
    }
}

3.2 마우스 위치와 드래그

마우스의 위치를 추적하고 마우스를 드래그하는 기능을 추가하여 오브젝트를 움직이는 예제를 만들어보겠습니다.

using UnityEngine;

public class MouseDragExample : MonoBehaviour
{
    private Vector3 offset;
    private Camera mainCamera;

    void Start()
    {
        mainCamera = Camera.main;
    }

    void OnMouseDown()
    {
        offset = transform.position - GetMouseWorldPosition();
    }

    void OnMouseDrag()
    {
        transform.position = GetMouseWorldPosition() + offset;
    }

    private Vector3 GetMouseWorldPosition()
    {
        Vector3 mouseScreenPosition = Input.mousePosition;
        mouseScreenPosition.z = mainCamera.nearClipPlane; // 카메라의 가까운 클리핑 면
        return mainCamera.ScreenToWorldPoint(mouseScreenPosition);
    }
}

4. 게임에 입력 시스템 통합하기

지금까지의 예시는 개별적으로 입력을 감지하고 반응하는 방법을 보여주었습니다. 실전에서 게임은 다양한 입력을 통합하여 더 복합적인 반응을 만들어내야 합니다.
입력 시스템을 통합하여 플레이어의 행동을 더욱 자연스럽고 직관적으로 만들 수 있습니다.

4.1 사용자 인터페이스(UI)와의 상호작용

UI와의 상호작용은 입력 시스템의 중요한 부분입니다. 예를 들어, 버튼 클릭 시 특정 행위를 수행하도록 할 수 있습니다.
Unity의 UI 시스템을 이용하여 버튼을 만들고, 해당 버튼과 상호작용하는 방법을 살펴보겠습니다.

using UnityEngine;
using UnityEngine.UI;

public class ButtonClickExample : MonoBehaviour
{
    public Button myButton;

    void Start()
    {
        myButton.onClick.AddListener(OnButtonClick);
    }

    void OnButtonClick()
    {
        Debug.Log("버튼이 클릭되었습니다.");
    }
}

4.2 복합적인 입력 처리

게임에서 키보드, 마우스, 그리고 UI 입력을 함께 처리하는 방법을 익힙니다.
가장 간단한 예제는 게임 오브젝트를 클릭하여 이동하고, 동시에 키보드를 사용하여 다른 동작을 수행하도록 하는 것입니다.

using UnityEngine;

public class CombinedInputExample : MonoBehaviour
{
    public float moveSpeed = 5f;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                transform.position = Vector3.MoveTowards(transform.position, hit.point, moveSpeed * Time.deltaTime);
            }
        }

        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        }
    }
}

5. 결론

본 강좌에서는 유니티에서 키보드와 마우스 입력을 감지하는 방법을 살펴보았습니다.
유니티의 입력 시스템을 활용하여 사용자의 입력을 처리하고, 이를 게임의 다양한 기능에 통합하는 기본적인 방법을 배웠습니다.
이제 여러분은 이러한 입력 시스템을 바탕으로 창의적인 아이디어를 탐구할 준비가 되어 있습니다.
다음 단계로는 더 복잡한 입력 처리와 사용자 경험을 최적화하는 방법에 대해 공부해보시기를 권장합니다.

더 많은 정보와 실습을 통해 유니티의 입력 시스템을 더욱 깊이 있는 이해를 가지게 되길 바랍니다.
이제 여러분의 게임 개발 여정을 시작해보세요!