점프하기
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 40번째.
점프는 스페이스바를 누르는 순간 한 번 설정되는 수직 속도입니다. 스크립트가 이미 적용하는 중력이 상승을 늦추고, 정점에서 멈춘 뒤 컨트롤러를 다시 아래로 내려오게 합니다. 남은 것은 특정 높이에 도달하기 위한 시작 속도입니다. 중력은 일정한 비율로 속도를 줄이므로, 속도 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 검사는 공중에서 다시 점프하는 것을 막습니다. 인스펙터에서 jumpHeight나 gravity를 변경해도 점프는 여전히 정확히 jumpHeight만큼 도달하지만, verticalSpeed = 8f처럼 고정된 속도를 사용하면 중력에 따라 도달하는 높이가 달라집니다.
챌린지
중급아이와 캥거루 모두에게 맞는 점프 스크립트를 만드세요.
Update()에서9f를 정확히jumpHeight만큼 올라가게 하는 시작 속도인Mathf.Sqrt(jumpHeight * -2f * gravity)로 바꾸세요.- 공중에서 점프하지 않도록 점프문의
if에&& controller.isGrounded를 추가하세요.
‘플레이’를 누르고 스페이스바를 누르세요. 아이는 1단위, 캥거루는 4단위 올라갑니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
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);
}
}
실제 게임 만들기의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드