Menu
CoddyTech

레이를 이용한 지면 확인

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 35번째.

점프는 지면에서만 시작해야 합니다. Standing on the Ground에서는 충돌 메시지로 계속 갱신되는 접촉 법선을 사용해 이를 판별했습니다. 레이는 “무언가 위에 서 있는가?”라는 질문에 그 자리에서 언제든 답해 줍니다. 중심에서 똑바로 아래쪽으로, 중심부터 바닥까지의 거리보다 약간 더 길게 쏘면 됩니다. 이 플레이어는 높이가 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유닛 올라간 상태에서도 다시 점프할 수 있고, 길이가 0이면 레이가 항상 바닥을 감지하므로 버튼을 누를 때마다 점프합니다.

레이는 플레이어 자신의 콜라이더 안에서 시작하지만, 레이는 자기 콜라이더를 건너뛰므로 플레이어를 감지하지 않습니다. GetKeyDown은 한 프레임 동안만 true이므로 키 입력은 Update()에서 읽습니다. 그리고 Jump with an Impulse에서처럼 일회성 임펄스를 바로 그곳에서 적용할 수 있습니다.

challenge icon

챌린지

중급

개구리는 공중에 있을 때도 스페이스바를 누를 때마다 점프하므로 하늘까지 올라갈 수 있습니다. 개구리가 지면에서만 점프하도록 Hopper를 수정하세요.

  • 개구리의 중심에서 수직 아래로 레이를 쏘는 bool IsGrounded() 메서드를 추가하세요. 개구리는 1.5 크기로 스케일된 구체이므로 반지름은 0.75입니다. 레이가 개구리의 밑면보다 0.1 더 멀리 닿도록 하세요.
  • 스페이스바를 누르고 IsGrounded()가 true일 때만 점프하세요.

Play를 눌러 점프를 두 번 시도한 다음, Check를 누르세요.

직접 해보기

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);
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

물리와 게임플레이의 모든 레슨