
안녕하세요! 오늘은 유니티에서 키보드의 방향키를 사용하여 플레이어가 앞으로 움직이면 앞으로, 뒤로 움직이면 뒤로, 그리고 좌우로 회전하도록 만드는 방법을 쉽게 자세히 설명해 드리겠습니다. 마지막에는 작동 가능한 전체 코드를 제공해 드릴게요.
인풋 시스템은 플레이어의 물리적 동작(키보드 입력, 마우스 움직임 등)을 게임 내에서 이해할 수 있는 정보로 변환하는 방법입니다. 즉, 플레이어가 누르는 버튼이나 키보드 입력을 게임이 인식하여 캐릭터나 오브젝트가 어떻게 반응해야 하는지를 결정합니다.
유니티에는 두 가지 인풋 시스템이 있습니다:
이번에는 올드 인풋 시스템을 사용하여 기본적인 움직임을 구현해 보겠습니다.

축(axis)은 -1에서 +1까지의 값을 가지며, 중간의 모든 값을 포함합니다. 유니티에는 기본적으로 다음과 같은 축이 설정되어 있습니다:
이 축들을 사용하여 플레이어의 입력을 감지하고, 이에 따라 움직임을 구현할 수 있습니다.
우선, 플레이어의 회전 속도와 이동 속도를 조절할 수 있는 변수를 선언합니다.
public float steerSpeed = 1.0f; // 회전 속도
public float moveSpeed = 1.0f; // 이동 속도
Update() 메서드는 매 프레임마다 호출되므로, 플레이어의 입력을 지속적으로 감지하고 반영하기에 적합합니다.
void Update()
{
// 좌우 입력 감지
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed;
transform.Rotate(0, 0, -steerAmount);
}
Input.GetAxis("Horizontal")은 플레이어의 좌우 입력을 -1에서 +1 사이의 값으로 반환합니다.steerSpeed를 곱하여 회전 속도를 조절합니다.transform.Rotate(0, 0, -steerAmount);를 통해 오브젝트를 회전시킵니다. 마이너스를 붙이는 이유는 회전 방향을 조정하기 위함입니다.void Update()
{
// 기존 코드...
// 전진 및 후진 입력 감지
float moveAmount = Input.GetAxis("Vertical") * moveSpeed;
transform.Translate(0, moveAmount, 0);
}
Input.GetAxis("Vertical")은 플레이어의 앞뒤 입력을 -1에서 +1 사이의 값으로 반환합니다.moveSpeed를 곱하여 이동 속도를 조절합니다.transform.Translate(0, moveAmount, 0);를 통해 오브젝트를 이동시킵니다.using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float steerSpeed = 1.0f; // 회전 속도
public float moveSpeed = 1.0f; // 이동 속도
void Update()
{
// 좌우 회전
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed;
transform.Rotate(0, 0, -steerAmount);
// 전진 및 후진
float moveAmount = Input.GetAxis("Vertical") * moveSpeed;
transform.Translate(0, moveAmount, 0);
}
}
steerSpeed와 moveSpeed는 인스펙터에서 쉽게 조절할 수 있도록 public으로 선언했습니다."Horizontal": 좌우 방향키 또는 A/D 키"Vertical": 상하 방향키 또는 W/S 키"Horizontal"과 "Vertical"의 철자를 정확히 입력해야 합니다. 그렇지 않으면 입력이 제대로 감지되지 않습니다.steerSpeed와 moveSpeed의 값을 조절하여 원하는 움직임 속도를 설정할 수 있습니다. 너무 큰 값은 과도한 움직임을 유발할 수 있으니 주의하세요.PlayerController로 설정합니다.steerSpeed와 moveSpeed 값을 적절하게 설정합니다. 예를 들어, 둘 다 1.0으로 시작해 볼 수 있습니다.이렇게 해서 키보드의 방향키를 사용하여 플레이어를 앞뒤로 움직이고 좌우로 회전시키는 방법을 배웠습니다. 인풋 시스템을 이해하고 이를 코드에 적용하여 플레이어의 움직임을 제어하는 기본적인 과정을 이해하셨을 거라 생각합니다.
다음 단계에서는 움직임을 더 부드럽게 만들거나, 컴퓨터 성능에 따라 움직임이 달라지는 문제를 해결하기 위해 프레임 독립적인 움직임을 구현할 수 있습니다. 이를 위해 Time.deltaTime을 사용하는 방법 등을 배우게 될 것입니다.
마지막으로, 작동 가능한 전체 코드를 다시 한 번 제공합니다:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Driver : MonoBehaviour
{
[SerializeField] float steerSpeed = 1f;
[SerializeField] float moveSpeed = 0.01f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float steerSpeed = Input.GetAxis("Horizontal");
float moveSpeed = Input.GetAxis("Vertical");
transform.Rotate(0, 0, -steerSpeed);
transform.Translate(0, moveSpeed, 0);
}
}
이 코드를 통해 게임 내에서 키보드 입력에 따라 플레이어를 움직일 수 있습니다. 꼭 직접 따라 해 보시고, 이해되지 않는 부분이 있으면 다시 한 번 읽어보세요.
안녕하세요!
오늘은 현재 사용하고 있는 코드에서 발생할 수 있는 문제점과 이를 해결하기 위해 Time.deltaTime을 사용하는 방법에 대해 자세히 설명해 드리겠습니다. 마지막에는 작동 가능한 전체 코드를 제공해 드릴게요.
먼저, 현재 사용하고 있는 코드를 살펴보겠습니다:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Driver : MonoBehaviour
{
[SerializeField] float steerSpeed = 1f;
[SerializeField] float moveSpeed = 0.01f;
void Update()
{
float steerSpeed = Input.GetAxis("Horizontal");
float moveSpeed = Input.GetAxis("Vertical");
transform.Rotate(0, 0, -steerSpeed);
transform.Translate(0, moveSpeed, 0);
}
}
이 코드는 플레이어의 입력에 따라 오브젝트를 회전하고 이동시키는 간단한 코드입니다. 하지만 이 코드에는 중요한 문제가 있습니다.
현재 코드에서는 Update() 메서드가 매 프레임마다 호출되며, 각 프레임에서 일정한 양의 회전과 이동이 발생합니다. 그러나 컴퓨터마다 프레임률(초당 프레임 수)이 다르기 때문에, 빠른 컴퓨터에서는 더 많은 프레임이 처리되고, 느린 컴퓨터에서는 더 적은 프레임이 처리됩니다.
예를 들어:
현재 코드에서는 프레임마다 같은 양의 움직임이 발생하므로, 빠른 컴퓨터에서는 초당 움직임이 100번 적용되고, 느린 컴퓨터에서는 초당 움직임이 30번 적용됩니다. 결과적으로 빠른 컴퓨터에서 게임이 훨씬 더 빠르게 진행되고, 느린 컴퓨터에서는 느리게 진행됩니다.
이러한 문제를 해결하기 위해서는 프레임률에 독립적인 움직임을 구현해야 합니다. 여기서 Time.deltaTime이 필요합니다.
움직임이나 회전 값을 계산할 때, 해당 값에 Time.deltaTime을 곱해줍니다. 이렇게 하면 움직임이 초당 속도로 계산됩니다.
예를 들어:
moveAmount = speed * Time.deltaTime;이제 현재 코드를 수정하여 Time.deltaTime을 적용해 보겠습니다.
현재 Update() 메서드 내에서 steerSpeed와 moveSpeed를 다시 선언하고 있습니다. 이는 클래스 멤버 변수와 혼동을 일으킬 수 있으므로 변수 이름을 수정하겠습니다.
void Update()
{
float steerAmount = Input.GetAxis("Horizontal");
float moveAmount = Input.GetAxis("Vertical");
// ...
}
steerAmount와 moveAmount에 Time.deltaTime과 속도 변수를 곱해줍니다.
void Update()
{
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime;
float moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
// ...
}
전체적인 수정된 코드는 다음과 같습니다:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Driver : MonoBehaviour
{
[SerializeField] float steerSpeed = 300f; // 회전 속도
[SerializeField] float moveSpeed = 20f; // 이동 속도
void Update()
{
// 입력 값 받기
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime;
float moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
// 회전 및 이동
transform.Rotate(0, 0, -steerAmount);
transform.Translate(0, moveAmount, 0);
}
}
Time.deltaTime을 곱해주면 움직임이 시간에 기반하여 계산되기 때문에, 기존의 속도 값으로는 움직임이 매우 느려질 수 있습니다. 따라서 steerSpeed와 moveSpeed의 값을 적절히 조절해야 합니다.
steerSpeed): 300 정도moveSpeed): 20 정도이 값은 필요에 따라 조절하시면 됩니다.
최종적으로 수정된 전체 코드는 다음과 같습니다:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Driver : MonoBehaviour
{
[SerializeField] float steerSpeed = 1f;
[SerializeField] float moveSpeed = 0.01f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 입력 값 받기
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime;
float moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
// 회전 및 이동
transform.Rotate(0, 0, -steerAmount);
transform.Translate(0, moveAmount, 0);
}
}

steerSpeed와 moveSpeed 값을 조정하여 원하는 움직임을 얻을 때까지 튜닝합니다.이렇게 해서 Time.deltaTime을 사용하여 프레임률에 독립적인 움직임을 구현하는 방법을 배웠습니다. 이를 통해 다양한 환경에서 일관된 게임 플레이 경험을 제공할 수 있습니다.
프레임률 독립적인 움직임은 게임 개발에서 매우 중요한 개념이며, 앞으로의 개발에서도 자주 사용될 것입니다.
다음 강의에서 더 흥미로운 내용을 다루도록 하겠습니다. 감사합니다!