학습 매체 : 책
책이름 : 레트로의 유니티 게임 프로그래밍 에센스
저자 : 이제민
본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.
게임 세상 속의 모든 정보는 실시간으로 변한다. 실시간으로 변하는 정보를 주기적으로 체크할 필요가 있다. 예를 들어 인공지능 적이 계속 변하는 플레이어의 위치를 주기적으로 체크해야 정상적으로 플레이어를 추적할 수 있다.
따라서 대부분의 게임은 주기적으로 갱신 처리를 실행한다. 갱신 처리는 일반적으로 화면이 새로 그려지는 주기에 맞춰 실행한다.
영화는 1초에 24번, 컴퓨터 화면은 1초에 60번 정도 화면을 새로 그린다. 매번 새로 그리는 각각의 화면을 프레임(Frame)이라고 한다.
1초 동안 화면이 새로 그려지는 횟수를 초당프레임 또는 FPS(Frame Per Second)라고 부른다.
PC나 콘솔 게임의 화면은 보통 60FPS로 그려진다. 60FPS는 화면을 1초에 60번 갱신하므로 이전 프레임과 다음 프레임 사이의 시간 간격이 1/60초이다.
다만 60FPS는 평균값일 뿐이고, 실제 FPS는 컴퓨터 성능에 따라 달라진다. 따라서 PC 게임을 개발할 때는 60FPS를 평균으로 생각하되, 실제 FPS는 가변적임을 명심해야 한다.
Update( ) 메서드는 Start( ) 메서드처럼 특정 시점에 자동으로 실행되는 유니티 이벤트 메서드이다. Update( ) 메서드는 한 프레임에 한 번, 매 프레임마다 반복 실행된다.
만약 60FPS로 화면이 갱신되면 Update( ) 메서드는 1/60초마다(1초에 60회) 실행된다. 이렇게 짧은 간격으로 반복 실행되는 Update( ) 메서드를 사용하면 어떤 값이나 입력을 자주 체크하고 갱신하는 처리를 구현할 수 있다.
유니티의 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);
}
}
}
bool Input.GetKey(KeyCode key);
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를 반환한다는 사실에 주목하자.
다음 강의에서 계속~