레트로의 유니티 게임 프로그래밍 에센스 - 6.5

Cosmos·2023년 4월 5일
0

학습 매체 : 책

책이름 : 레트로의 유니티 게임 프로그래밍 에센스

저자 : 이제민


본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.


6.5 사용자 입력 감지


  • 변수를 선언했으니 입력을 감지하는 기능을 만들자. 입력을 감지하려면 Update( ) 메서드와 Input 클래스의 입력 감지 메서드가 필요하다.

6.5.1 Update( ) 메서드

  • 게임 세상 속의 모든 정보는 실시간으로 변한다. 실시간으로 변하는 정보를 주기적으로 체크할 필요가 있다. 예를 들어 인공지능 적이 계속 변하는 플레이어의 위치를 주기적으로 체크해야 정상적으로 플레이어를 추적할 수 있다.

  • 따라서 대부분의 게임은 주기적으로 갱신 처리를 실행한다. 갱신 처리는 일반적으로 화면이 새로 그려지는 주기에 맞춰 실행한다.


초당 프레임

  • 영화는 1초에 24번, 컴퓨터 화면은 1초에 60번 정도 화면을 새로 그린다. 매번 새로 그리는 각각의 화면을 프레임(Frame)이라고 한다.

  • 1초 동안 화면이 새로 그려지는 횟수를 초당프레임 또는 FPS(Frame Per Second)라고 부른다.

  • PC나 콘솔 게임의 화면은 보통 60FPS로 그려진다. 60FPS는 화면을 1초에 60번 갱신하므로 이전 프레임과 다음 프레임 사이의 시간 간격이 1/60초이다.

  • 다만 60FPS는 평균값일 뿐이고, 실제 FPS는 컴퓨터 성능에 따라 달라진다. 따라서 PC 게임을 개발할 때는 60FPS를 평균으로 생각하되, 실제 FPS는 가변적임을 명심해야 한다.


Update( ) 메서드

  • Update( ) 메서드는 Start( ) 메서드처럼 특정 시점에 자동으로 실행되는 유니티 이벤트 메서드이다. Update( ) 메서드는 한 프레임에 한 번, 매 프레임마다 반복 실행된다.

  • 만약 60FPS로 화면이 갱신되면 Update( ) 메서드는 1/60초마다(1초에 60회) 실행된다. 이렇게 짧은 간격으로 반복 실행되는 Update( ) 메서드를 사용하면 어떤 값이나 입력을 자주 체크하고 갱신하는 처리를 구현할 수 있다.


6.5.2 Input을 사용한 입력 감지

  • 유니티의 Input 클래스는 사용자 입력을 감지하는 메서드를 모아둔 집합이다. Input의 입력 감지 메서드는 실행 시점에 어떤 키를 눌렀는지 알려준다.

  • Update( ) 메서드는 1초에 수십 번씩 실행된다. 따라서 Update( ) 메서드에서 입력 감지 메서드를 사용하면 입력 감지 메서드가 매우 짧은 간격으로 반복 실행되기 때문에 플레이어는 입력이 즉시 감지된다고 느낀다.

  • 이제 PlayerController 스크립트로 돌아가서 Update( ) 메서드에 사용자 입력을 감지하고 playerRigidbody에 힘을 주는 코드를 작성해보자.

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

public class PlayerController : MonoBehaviour
{
    public Rigidbody playerRigidbody;
    public float speed = 8f;

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow) == true)
        {
            playerRigidbody.AddForce(0f, 0f, speed);
        }

        if (Input.GetKey(KeyCode.DownArrow) == true)
        {
            playerRigidbody.AddForce(0f, 0f, -speed);
        }

        if (Input.GetKey(KeyCode.RightArrow) == true)
        {
            playerRigidbody.AddForce(speed, 0f, 0f);
        }

        if (Input.GetKey(KeyCode.LeftArrow) == true)
        {
            playerRigidbody.AddForce(-speed, 0f, 0f);
        }
    }
}
  • 완성된 코드는 상하좌우 방향키를 감지하고 게임 오브젝트를 해당 방향으로 움직인다.

6.5.3 Input.GetKey( )

  • Input.GetKey( ) 메서드는 키보드의 식별자KeyCode 타입으로 입력받는다.
bool Input.GetKey(KeyCode key);
  • Input.GetKey( ) 메서드는 실행될 때 해당 키를 누르고 있으면 true, 그렇지 않으면 false를 반환한다.
if(Input.GetKey(KeyCode.UpArrow) == true)
{
	playerRigidbody.AddForce(0f, 0f, speed);
}
  • Input.GetKey(KeyCode.UpArrow)가 실행될 때 키보드 위쪽 방향키(KeyCode.UpArrow)를 누르고 있지 않으면 Input.GetKey(KeyCode.UpArrow)는 false를 반환한다.

  • 그러면 if문 조건을 만족하지 않아 playerRigidbody.AddForce(0f, 0f, speed);가 실행되지 않는다.

  • 반대로, 위쪽 방향키를 누르고 있으면 true를 반환한다. 따라서 playerRigidbody.AddForce(0f, 0f, speed);가 실행되고 Z축(앞쪽) 방향으로 힘이 가해진다.

  • Input.GetKey( )를 사용해 입력을 감지하는 나머지 if 문도 같은 원리로 동작한다.

KeyCode

  • Input.GetKey( ) 메서드의 입력으로 사용하는 KeyCode는 키보드의 키 식별자를 쉽게 가리키기 위한 타입이다. KeyCode 타입은 내부적으로는 숫자로 동작한다.
  • 키보드의 키에는 식별자가 할당되어 있다. 예를 들어, 위쪽 방향키의 식별자는 273이다. 하지만 숫자로 된 키 식별자를 모두 외우는 것은 무리이다. 따라서 키 식별자 273에 대응하는 KeyCode.UpArrow를 사용한다.

Input.GetKey( ) 계열 메서드

  • Input.GetKey( ) 메서드는 지정한 키를 누를 동안 true를 반환한다. 이외에도 Input.GetKey( ) 메서드처럼 키보드 입력을 감지하지만 감지 시점이 다른 Input.GetKey( ) 계열의 메서드들이 있다.

1. Input.GetKey( ) : 해당 키를 '누르는 동안' true, 그 외에는 false 반환

2. Input.GetKeyDown( ) : 해당 키를 '누르는 순간' true 그 외에는 false 반환

3. Input.GetKeyUp( ) : 해당 키를 누르다가 손을 '떼는 순간' true, 그 외에는 false 반환

  • 여기서 Input.GetKeyDown( )Input.GetKeyUp( )은 해당 키를 '누르는 동안'에는 false를 반환한다는 사실에 주목하자.

다음 강의에서 계속~

profile
게임 개발을 목적으로 공부하고 있는 대학생입니다.

0개의 댓글