본문 바로가기

유니티 기초/개념

[Unity 개념] 8. 플레이어 점프에 대하여

※참고사항※
해당 포스트는 본업 개발자가 정성껏 포스팅한 포스트가 아닙니다!
평범한 고등학생이 유니티를 배우면서 적어나가는 포스트라는 점을 이해해 주십사 하고 청하는 바입니다.
(잘못된 정보는 댓글로 감사히 받겠습니다!)

이 포스팅을 보시기 전에 아래 링크를 타고 이전 포스팅을 보시고 오시면 이해가 더 잘될겁니다!

 

[Unity 개념] 3. 중력 적용에 대하여

'중력'에 대한 정리입니다!

rktrjtrit-unity.tistory.com/4

 

[Unity 개념] 4. 충돌 적용에 대하여

'충돌'에 대한 정리입니다!

rktrjtrit-unity.tistory.com/5


목차

1. 플레이어 점프
2. 무한 점프 방지

 

1. 플레이어 점프

플레이어가 점프하기 위해선 먼저 위로 움직여야겠죠?

// 점프와 관련된 로직이 있는 부분만 가져왔습니다!

[SerializeField]
private float jump_power;

private void Awake()
{
    // 변수 초기화
    speed = 5f;
    jump_power = 5f;
    item_num = 0;

    rigid = GetComponent<Rigidbody2D>();

    // Z축 고정
    rigid.freezeRotation = true;
}

private void Update()
{
    // 메소드를 만들었다면 호출하는 것을 잊지 마세요!
    Move();
    Jump();

    // E 키를 누르면 아이템 사용
    if (Input.GetKeyDown(KeyCode.E)) { ItemUse(); }
}

private void Jump()
{
    // 스페이스 바를 눌렀을 때
    if (Input.GetKeyDown(KeyCode.Space))
    {
        // 플레이어가 위로 이동함
        rigid.AddForce(Vector2.up * jump_power, ForceMode2D.Impulse);
    }
}

위와 같이 코드를 작성한 뒤에 스페이스 바를 누르면 위로 올라가긴 합니다만...

(플레이어가 계속 위로만 올라간다면 플레이어 오브젝트에 Rigidbody 2D 컴포넌트를 추가해주세요!)

 

 

 

위의 영상과 같이 스페이스 바를 계속 누르다 보면 플레이어가 하늘로 승천하는 광경을 보실 수 있습니다.

이 무한 점프는 보통 RayCast를 사용해서 방지합니다.

 

2. 무한 점프 방지

RayCast를 사용하기 위해선 Layer를 사용해야 합니다.

우선 Layer를 추가해야하는데요.

Tag를 추가했을 때와 비슷하게 추가하면 됩니다.

 

Tag의 바로 옆에 위치한 Layer를 클릭 후 Add Layer를 누른 뒤

User Layer 숫자로 되어 있는 아무 빈칸에 "Platform"이라고 쓴 뒤 엔터를 쳐서 저장하고

모든 Platform 오브젝트들에 적용 시켜보겠습니다.

(모르겠다면 아래 영상을 따라해 주세요!)

 

 

Layer를 추가했다면 로직을 짜보겠습니다.

// 관련 로직이 있는 부분만 따왔습니다.

[SerializeField]
private bool is_jump;

private void Jump()
{
    // 스페이스 바를 눌렀을 때 && is_jump의 값이 false일 때
    if (Input.GetKeyDown(KeyCode.Space) && !is_jump)
    {
        // 점프했다고 알려줌
        is_jump = true;

        // 플레이어가 위로 이동함
        rigid.AddForce(Vector2.up * jump_power, ForceMode2D.Impulse);
    }
}

// 일정한 간격마다 호출됨
private void FixedUpdate()
{
    // Debug -> 게임을 개발하는 동안 쉽게 디버깅하기 위해 목적의 클래스  
    // DrawRay() -> 색상과 함께  시작 지점부터 (시작 지점 + 방향과 길이) 까지 선을 그림
    Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0)); // 없어도 실행에는 문제 없음

    // RaycastHit -> Raycast에서 정보를 다시 얻는데 사용함  /  Raycast -> 원점에서 Ray를 날려 거리 이내에 물체가 있는지 없는지 "충돌감지"를 해줌
    RaycastHit2D ray_hit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Platform")); // 매개변수 : Raycast(광선의 시작점, 광선의 방향, RaycastHit 변수, 최대 거리);

    if (rigid.velocity.y < 0) // 현재 떨어지고 있을 때 (무한 점프를 막기 위한 조건)
    {
        if (ray_hit.collider != null) // Ray에 충돌한 물체가 있을 때
        {
            if (ray_hit.distance < 0.5f) // Ray에 충돌한 물체와의 거리가 0.5 이하일 때 (착지했을 때)
            {
                // 점프가 멈췄다고 알려줌
                is_jump = false;
            }
        }
    }
}

 

적용시킨 뒤에 실행시키면 아래의 영상과 같이 아무리 스페이스 바를 눌러도 1단 점프밖에 안되게 됩니다.

 

이상으로 포스팅을 마치겠습니다.

다음 포스팅에서는 텍스트에 대해서 공부해보겠습니다!