점프하기
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 39번째.
점프는 Space 키를 누르는 순간 한 번 설정되는 수직 속도입니다. 스크립트가 이미 더하고 있는 중력이 상승 속도를 늦추고, 정점에서 멈춘 다음 컨트롤러를 다시 아래로 끌어내립니다. 남은 것은 특정 높이에 도달하기 위한 시작 속도입니다. 중력은 일정한 비율로 속도를 줄이므로, 속도 v로 시작하는 점프는 멈추기 전에 v * v / (2 * g) 단위만큼 상승합니다. 이를 반대로 계산하면 높이 h에 도달하기 위한 시작 속도는 v = √(2 * g * h)입니다.
gravity에 음수인 -20이 저장되어 있고 점프 높이가 2.5단위라면, 식은 Mathf.Sqrt(2.5f * -2f * -20f)이며, 이는 100의 제곱근인 초당 10단위입니다. 제곱근은 음수에서 NaN이 되므로 -2f가 음수 중력을 양수로 바꿉니다:
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;초기화 조건은 verticalSpeed < 0f를 검사하므로 낙하할 때만 적용됩니다. 점프 줄 다음에 단순히 if (controller.isGrounded)로 초기화하면 점프가 실행되는 프레임에 점프 속도를 덮어쓰게 됩니다. 점프 조건의 controller.isGrounded 검사는 공중에서 점프하는 것을 막습니다. Inspector에서 jumpHeight 또는 gravity를 바꾸어도 점프는 여전히 정확히 jumpHeight에 도달합니다. 반면 verticalSpeed = 8f처럼 속도를 고정하면 중력이 달라질 때마다 도달 높이도 달라집니다.
챌린지
중급두 점퍼는 동일한 Jumper.cs를 실행합니다. Kid의 Inspector에서는 gravity를 -18로, jumpHeight를 1로 설정하고, Kangaroo의 경우 gravity는 -8, jumpHeight는 4로 설정합니다. 스페이스바를 누르면 verticalSpeed가 9로 설정되는데, 이 값은 시행착오로 찾은 값입니다. 어느 점퍼에도 맞지 않고 공중에서도 작동합니다. 점프를 수정하세요:
- 스페이스바를 누르면 각 점퍼의
jumpHeight와gravity를 사용해 계산한 정확한 높이만큼 점프합니다. - 바닥에 닿아 있는 점퍼만 점프할 수 있습니다.
Play를 누르고 점프한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Jumper : MonoBehaviour
{
public float speed = 5f;
public float gravity = -18f;
public float jumpHeight = 1f;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump"))
{
verticalSpeed = 9f;
}
verticalSpeed += gravity * Time.deltaTime;
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.