InputManager 실습하기 - 260902

매콤개발코딩
매콤개발코딩
∙∙조회 13

InputManager 실습 기록

1. 준비

  • 새 Scene
  • Script: InputProbe
  • 게임 오브젝트: TargetCube

2. 큐브와 스크립트 생성

  1. 게임 오브젝트/큐브 TargetCube

  1. 컴포넌트 부여

 

2. 세 가지 키 함수의 차이 확인하기

  1. 스크립트 작성
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputProbe : MonoBehaviour
{
    private void Update() // 매 프레임마다 확인
    {
        ReadKeys();
    }

    private void ReadKeys()
    {
        // '스페이스'를 '눌렀을 때'
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("INputProbe: GetKeyDown");
        }
        // '스페이스'를 '누르고 있을 때'
        if (Input.GetKey(KeyCode.Space))
        {
            Debug.Log("InputProbe: GetKey");
        }
        // '스페이스'를 눌렀다 '땠을 때'
        if (Input.GetKeyUp(KeyCode.Space))
        {
            Debug.Log("InputProbe: GetKeyUp");
        }
    }
}

  1. 저장한 뒤 재생해 확인하기

  • 예측한 결과 그대로 나온 것을 확인했다.
  • 누른 시간은 1초 가량인데 무려 597 줄이나 콘솔이 출력됐다.

3. 키 입력으로 게임 오브젝트를 숨기기/드러내기

스크립트를 아래로 수정하고 재생해 확인한다.

csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputProbe : MonoBehaviour
{
    // 찾은 렌더러를 담을 변수
    private Renderer _renderer;

    private void Awake() // 재생이 시작되고 모든 오브젝트들이 준비될 때 한 번 실행
    {
        CacheComponents();
    }
    private void Update() // 매 프레임마다 확인
    {
        ReadToggleKey();
    }

    private void CacheComponents() // 렌더러를 찾아서 만들어준 변수에 담음
    {
        _renderer = GetComponent<Renderer>();
    }
    
    private void ReadToggleKey()
    {
        // 만약 스페이스가 '눌리면'
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // bool 타입인 enabled의 값을 뒤집어준다.
            _renderer.enabled = !_renderer.enabled;
            Debug.Log($"InputProbe: 보이기 상태는 {_renderer.enabled}입니다.");
            // 예상: 처음엔 켜져있어 true이기 때문에
            // 스페이스를 누르면 false로 바꾼 뒤 출력될것
        }
    }
}

예상한 결과를 확인했다.

4. 일부러 틀려 보기

ReadToggleKey의 Input.GetKeyDown를 Input.GetKey로 바꿔보았다.

예상한 결과: '스페이스'가 '눌려져 있는 순간'마다 작동할테니 콘솔이 엄청 많이 출력될 것

확인한 결과:

  • 예상한 결과를 확인했다.
  • 매 프레임마다 작동했다는 것을 확인했다.

5. 두 가지 축의 함수값 나란히 찍기

  1. 상수로 축 이름 선언하기
csharp
private const string AXIS_HORIZONTAL = "Horizontal";

  1. Updage에 메서드 넣기
csharp
private void Update()
    {
        ReadToggleKey();
        ReadAxes();
    }

  1. 메서드 추가하기
csharp
private void ReadAxes()
    {
        float smoothed = Input.GetAxis(AXIS_HORIZONTAL);
        float raw = Input.GetAxisRaw(AXIS_HORIZONTAL);
        Debug.Log($"InputProbe: GetAxis는 {smoothed}, GetAxisRaw는 {raw}입니다.");
    }

전체 코드는 다음과 같다.

csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputProbe : MonoBehaviour
{
    
    private Renderer _renderer;
    // 상수로 선언한 축 이름
    private const string AXIS_HORIZONTAL = "Horizontal";

    private void Awake()
    {
        CacheComponents();
    }
    private void Update()
    {
        ReadToggleKey();
        ReadAxes();
    }

    private void CacheComponents()
    {
        _renderer = GetComponent<Renderer>();
    }
    
    private void ReadToggleKey()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            _renderer.enabled = !_renderer.enabled;
            Debug.Log($"InputProbe: 보이기 상태는 {_renderer.enabled}입니다.");
        }
    }
    
    // 추가한 메서드
    private void ReadAxes()
    {
        float smoothed = Input.GetAxis(AXIS_HORIZONTAL);
        float raw = Input.GetAxisRaw(AXIS_HORIZONTAL);
        Debug.Log($"InputProbe: GetAxis는 {smoothed}, GetAxisRaw는 {raw}입니다.");
    }
}

  • GetAxis는 필터를 거쳐가며 -1,0,1 사이에서 서서히 변했고 GetAxisRaw는 오직 -1,0,1만 입력된 것을 확인했다.
  • Negative Botton인 A를 누르면 값이 -1로 바뀌고 Positive Botton인 D를 눌렀을 떈 값이 1로 바뀌었다.

6. 축 값으로 누적하기

  1. 필드를 먼저 생성
csharp
// 인스펙터에서 다룰 수 있게 '직렬화'한 필드
    [SerializeField] private float _amountPerSecond = 3f;
    private float _total; // 값을 쌓을 변수

  1. 메서드를 수정
csharp
// 변수에 축의 값 * 초당 속도 * 프레임이 차지한 시간을 초로 바꾸는 것
        _total += raw * _amountPerSecond * Time.deltaTime;
        Debug.Log($"InputProbe: 누적값은 {_total}입니다.");

전체 코드

csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputProbe : MonoBehaviour
{
    private const string AXIS_HORIZONTAL = "Horizontal";
    // 인스펙터에서 다룰 수 있게 '직렬화'한 필드
    [SerializeField] private float _amountPerSecond = 3f;
    private float _total; // 값을 쌓을 변수
    
    private void Update()
    {
        ReadAxes();
    }
    
    // 추가한 메서드
    private void ReadAxes()
    {
        float raw = Input.GetAxisRaw(AXIS_HORIZONTAL);
        // 변수에 축의 값 * 초당 속도 * 프레임이 차지한 시간을 초로 바꾸는 것
        _total += raw * _amountPerSecond * Time.deltaTime;
        Debug.Log($"InputProbe: 누적값은 {_total}입니다.");
    }
}

저장하고 실행한 결과들

  1. 인스펙터에서 초당 속도를 3으로 놓고 3초 동안 눌렀을 때

결과가 9에 가까워졌다.

  1. 인스펙터에서 초당 속도를 1로 변경하고 3초 동안 눌렀을 때

결과값이 3에 가까워졌다.

결과에 대한 해석

  • 오른쪽(D키 / 1)의 축으로 * 초당 속도 3/1 으로 * 3초간 이동 했으므로(델타타임을 통해) 결과는 9/3 이였다.
  • 반대로 왼쪽(A키 / -1)의 방향으로 갔을 때에도 동일한 과정을 통해 값이 나왔다.

7. 마우스 버튼과 좌표 읽기

  1. 버튼 인덱스(좌클릭은 0)를 상수 변수로 두기
csharp
private const int MOUSE_BUTTON_LEFT = 0;

  1. 메서드를 추가하고 메서드를 부를 수 있게 Update에서 호출하기
csharp
private void Update()
    {
        ReadMouseButton();
    }

private void ReadMouseButton()
    {
        // 마우스 0번 버튼이 '눌렸을 때'
        if (Input.GetMouseButtonDown(MOUSE_BUTTON_LEFT))
        {
            // 마우스 포인터가 지금 있는 자리를 출력하기
            Debug.Log($"InputProbe: 현재 좌표 {Input.mousePosition}");
        }
    }

저장하고 실행한 결과

  1. 게임뷰 정가운데 찍어보기

확인된 좌표는 299/218/0

  1. 게임뷰 오른쪽 위 찍어보기

확인된 좌표는 523/452/0 (x 증가, y증가)

  1. 게임뷰 왼쪽 아래 찍어보기

확인된 좌표는 106/76/0 (x감소, y감소)

결과

오른쪽으로 갈수록 x가 커지고, 위로 갈수록 y가 커진다.

8. 마우스가 움직인 양 읽기

  1. 상수 둘 더하기
csharp
private const string AXIS_MOUSE_X = "Mouse X";
private const string AXIS_MOUSE_Y = "Mouse Y";

  1. Update에서 실행시킬 메서드 만들기
csharp
private void ReadMouseDelta()  
    {  
        float mouseX = Input.GetAxis(AXIS_MOUSE_X);  
        float mouseY = Input.GetAxis(AXIS_MOUSE_Y);  
        Debug.Log($"InputProbe: 마우스가 가로 {mouseX}, 세로 {mouseY}만큼 움직였습니다.");  
    }

  1. 실행시킨 결과

마우스를 움직일 때 마다 실시간으로 값이 변하고, 마우스를 멈추면 두 값이 모두 0이 된다.

마우스를 빠르게 움직이면 GetAxis를 통해 서서히 변하는 좌표들이 더 많이 더 빨리 출력되는 것을 확인했다.

5단계에서 A키와 D키를 입력했을 때는 각각 -1과 1의 값으로 서서히 변해갔지만

"마우스를 계속 움직이는게 아니다보니" 마우스가 멈추는 순간 값이 0으로 변해버렸다.