레이를 이용한 지면 확인
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 37번째.
점프는 지면에서만 시작해야 합니다. 이전에는 충돌 메시지로 최신 상태를 유지하는 접촉 법선을 통해 지면에 서 있는지 판별했습니다. 레이를 사용하면 "무언가 위에 서 있나요?"라는 질문에 그 자리에서 언제든 답할 수 있습니다. 중심에서 곧장 아래로, 중심에서 바닥까지의 거리보다 조금 더 길게 레이를 쏘면 됩니다. 이 플레이어는 높이가 2단위인 캡슐이므로 바닥은 중심에서 아래로 1단위 떨어져 있고, 레이의 길이는 1.1입니다.
public float jumpForce = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}추가된 0.1은 여유분입니다. 바닥에 놓인 물체는 바닥보다 아주 조금 위에 있거나 아주 조금 파고들 수 있으므로, 길이가 정확히 1인 레이는 일부 프레임에서 빗나갑니다. 반대로 너무 길어도 문제가 됩니다. 길이를 3으로 설정하면 플레이어가 공중에서 2단위만큼 더 올라간 위치에서도 다시 점프할 수 있고, 길이가 전혀 없으면 레이가 항상 바닥을 찾으므로 버튼을 누를 때마다 점프합니다.
레이는 플레이어 자신의 콜라이더 안에서 시작하지만, 레이는 자신의 콜라이더를 건너뛰므로 플레이어를 감지하지 않습니다. 키 입력은 Update()에서 읽습니다. GetKeyDown은 한 프레임 동안만 true이기 때문입니다. 또한 임펄스 점프에서처럼, 한 번만 적용되는 임펄스를 바로 추가할 수 있습니다.
챌린지
중급개구리는 땅에서만 점프하게 하세요.
bool IsGrounded()를 추가하고,Physics.Raycast(transform.position, Vector3.down, 0.85f)를 반환하게 하세요. 이 값은 개구리의 반지름 0.75에 0.1을 더한 값입니다.Update()에서 Space 키에 대한if문에&& IsGrounded()를 추가하세요.
‘플레이’를 누르고 Space 키를 두 번 누르세요. 개구리가 한 번 점프합니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float jumpForce = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드