코스
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 48번째.
이 장에서는 3D 플랫폼 게임을 만듭니다. 떠 있는 플랫폼 사이를 달리고 점프하고, 미끄러지듯 움직이는 플랫폼을 타고, 체크포인트에 닿아 떨어져도 시작 지점으로 되돌아가지 않도록 하고, 화면에 개수가 표시되는 보석을 모으고, 결승선을 넘어 다음 레벨로 이동한 뒤 자신의 최고 기록을 경신해 봅니다. 이 게임에는 처음부터 프로젝트에 스크립트가 다섯 개 있습니다. Player, MovingPlatform, Checkpoint, Gem, FinishLine입니다. 마지막 네 개는 지금은 비어 있으며, 각 강의에서 하나씩 채워 나갑니다. 플레이어는 Input System의 액션으로 조작하는 CharacterController이고 카메라는 플레이어의 자식이므로 스크립트 없이도 플레이어를 따라갑니다.
CharacterController는 두 가지 방식으로 움직입니다. Move(motion)은 일정 거리를 이동시키며 다른 요소는 더하지 않으므로, 중력, 점프, Time.deltaTime은 Character Controller 장에서처럼 스크립트에서 처리해야 합니다. SimpleMove(speed)는 초당 단위로 속도를 받아 프레임 시간을 직접 곱하고 중력을 더합니다. 전달한 y 값은 무시하므로, 이 방식으로 움직이는 캐릭터는 절벽에서 떨어지지만 절대 점프할 수 없습니다. 위에서 내려다보는 목축 게임의 이 양치기 개는 점프할 필요가 없으므로, SimpleMove와 Move 액션만으로 스크립트 전체를 구성할 수 있습니다.
using UnityEngine;
using UnityEngine.InputSystem;
public class Sheepdog : MonoBehaviour
{
[SerializeField] private float speed = 6f;
private CharacterController controller;
private InputAction moveAction;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
}
}플랫폼 게임의 플레이어는 점프해야 하므로 자체적인 수직 속도를 유지하고 Move로 움직입니다. Input 클래스를 사용하는 대신 Move 및 Jump 액션을 읽습니다. Unity는 프레임마다 Move 또는 SimpleMove를 한 번 호출하도록 권장합니다. 걷기와 낙하를 같은 호출에 넣으면 isGrounded는 그 전체 이동을 기준으로 상태를 나타냅니다.
챌린지
중급플레이어부터 플랫폼 게임을 시작하세요. Player 스크립트에는 speed(5), jumpHeight(1.5), gravity(-9.81), controller와 낙하를 위한 velocity가 있습니다. Start에서 Move 및 Jump 액션을 한 번 찾아 두고, Update에서 다음을 수행하세요.
- Move는 플레이어를 초당
speed단위만큼 이동시킵니다. x축을 따라 오른쪽과 왼쪽으로, z축을 따라 앞뒤로 이동합니다. - 중력은 매 프레임
gravity * Time.deltaTime을velocity.y에 더합니다. 컨트롤러가 지면에 닿아 있고velocity.y가 0보다 작으면, 먼저velocity.y를 -2로 설정하여 지면에 계속 붙어 있도록 합니다. - 지면에 닿은 상태에서 Jump를 누를 때마다
velocity.y를Mathf.Sqrt(jumpHeight * -2f * gravity)로 설정합니다. 즉,jumpHeight단위 높이만큼 점프합니다. Jump를 길게 눌러도 한 번만 점프하며, 공중에서는 점프할 수 없습니다. - 걷기 이동과
velocity를 합한 뒤Time.deltaTime을 곱해controller.Move를 한 번 호출합니다.
Play를 눌러 첫 번째 플랫폼들까지 점프한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// Move 액션으로 걷고, Jump 액션으로 점프하고, 중력에 따라 떨어집니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.