Menu
CoddyTech

레이를 이용한 지면 확인

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이기 때문입니다. 또한 임펄스 점프에서처럼, 한 번만 적용되는 임펄스를 바로 추가할 수 있습니다.

challenge icon

챌린지

중급

개구리는 땅에서만 점프하게 하세요.

  1. bool IsGrounded()를 추가하고, Physics.Raycast(transform.position, Vector3.down, 0.85f)를 반환하게 하세요. 이 값은 개구리의 반지름 0.75에 0.1을 더한 값입니다.
  2. 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 플레이그라운드