본문 바로가기

유니티

유니티 강좌 06. 2D 플랫포머 점프

플랫포머 게임에서 좌우 이동과 함께 필수적인 요소 중 하나가 바로 점프입니다. 점프는 여러 변수들을 만들어 내면서 게임에 재미를 더하죠. 저번 강좌와 이어서 이번에는 플랫포머에서의 점프에 대해서 알려드리도록 하겠습니다.


 

유니티 강좌 02. 2D 플레이어 이동

지난 강좌에서 유니티의 기본 인터페이스에 대해서 배웠습니다. 그럼 이제 본격적으로 유니티를 사용해 봐야겠죠. 게임에서 가장 기본적인 요소 중 하나가 바로 플레이어입니다. 그중에서도 제

torotoblog.tistory.com

 

유니티 강좌 05. 2D 플랫포머 이동

저번에는 탑뷰 형식의 게임에 사용될 플레이어 상하좌우 이동에 대해서 알려드렸습니다. 하지만 마리오, 소닉, 테라리아 같은 플랫포머 게임을 만들 때는 중력이 적용된 좌우 이동이 필요합니

torotoblog.tistory.com


점프를 하기 위해서는 선행되어야 하는 조건이 있습니다. 플레이어가 땅을 밟고 있는 상태에서 점프를 시작해야 하는 것이죠. 더블 점프 같은 요소가 있는 게임도 있지만, 지금 저희가 만들 것은 싱글 점프이기 때문에 땅을 밟고 있지 않으면 점프가 되지 않도록 할 겁니다. 그렇기 때문에 플레이어가 땅을 밟고 있는지 확인할 방법이 필요한데요, 이걸 해결하기 위해 플레이어 오브젝트의 자식(Child)로 빈 오브젝트를 하나 생성해 줍시다.

이 오브젝트를 Ground Check라고 부르겠습니다. 이름 칸 옆을 보면 상자 아이콘이 있는데요, 여기를 클릭하시면 Scene 뷰에서 확인 할 수 있는 기즈모(Gizmo)를 선택할 수 있습니다. 기즈모는 게임 자체에서는 보이지 않는 요소들을 Scene 뷰 상에서 눈으로 확인 할 수 있도록 해주는 가상의 도형들입니다. 이 기즈모를 통해서 Ground Check 오브젝트가 어디에 위치하고 있는지 눈으로 볼 수 있게 됐습니다. 플레이어 발 정도의 위치에 배치해 보겠습니다.

다음으로는 땅 오브젝트가 땅이라는 것을 플레이어가 인식 할 수 있도록 레이어(Layer)를 설정해야 합니다. 레이어는 겹쳐 놓은 여러개의 필름이라 생각하시면 됩니다. 우린 땅만 만들어둔 필름을 하나 만드는거죠. 땅 오브젝트를 선택한 후 Inspector 창을 보시면 상단에 Layer 탭이 있습니다. 여기서 Add Layer 버튼을 클릭하면 새로운 레이어들을 생성할 수 있는데요, Ground라는 레이어를 하나 만들어서 땅 오브젝트에 적용시켜 줍시다.

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed;
    private float moveInput;
    private bool facingRight = true;

    public float jumpForce;
    public float checkRadius;
    private bool isGrounded;
    public Transform groundCheck;
    public LayerMask groundLayer;

    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, groundLayer);

        moveInput = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);

        if (moveInput > 0 && !facingRight)
        {
            Flip();
        }
        else if (moveInput < 0 && facingRight)
        {
            Flip();
        }
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.velocity = Vector2.up * jumpForce;
        }
    }

    private void Flip()
    {
        facingRight = !facingRight;
        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
    }
}

이제 오브젝트 설정은 끝났습니다. 코드를 한번 보죠. 저번 강좌와 이어지기 때문에 겹치는 코드는 제외하고 설명드리겠습니다.

public float jumpForce;
public float checkRadius;
private bool isGrounded;
public Transform groundCheck;
public LayerMask groundLayer;

새롭게 5가지 변수가 추가됐습니다. 점프할 높이 값인 jumpForce, 땅을 밟고 있는지 확인하는 isGrounded, Ground Check 오브젝트의 transform 값인 groundCheck, 땅을 감지할 범위 값인 checkRadius, 그리고 땅의 레이어인 groundLayer입니다.

private void FixedUpdate()
{
    isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, groundLayer);
}

우선은 플레이어가 땅을 밟고 있는지를 확인해야 합니다. Physics2D.OverlapCircle()를 사용할 건데요, 이 함수는 범위 내에 들어온 모든 콜라이더를 감지하는 역할을 합니다. groundCheck 위치를 중심으로 checkRadius를 반지름으로 하는 원을 만들어서 groundLayer와 동일한 레이어에 있는 콜라이더들을 찾죠. 만약 범위 내에 조건에 맞는 콜라이더가 있으면 참, 없으면 거짓을 반환합니다. 

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
        rb.velocity = Vector2.up * jumpForce;
    }
}

이제 점프를 위한 발판은 완성했으니 점프를 구현해 보겠습니다. 우선 if() 문에서 스페이스 바를 눌렀는지와 isGrounded가 참인지 확인할 겁니다. 두 값이 모두 참이라면 이번에는 rb.velocity의 y 값을 수정해 줄 겁니다. Vector2.up은 (0, 1)의 값을 가지고 있습니다. 여기에 jumpForce 만큼 곱해주게 되면 (0, jumpForce)의 값이 되겠죠. 이로써 플레이어가 위쪽 방향을 향해 움직이게 될 겁니다.

만든 변수들에 알맞은 값들을 입력해 줍시다. Ground Check에는 플레이어의 자식 오브젝트인 Ground Check 오브젝트를 추가하면 되고 Ground Layer은 Ground 레이어를 선택하시면 됩니다.

이제 테스트를 해 볼까요? 유니티 중앙 상단에 있는 플레이 버튼을 클릭해서 게임을 실행해 봅시다. 스페이스 바를 누르면 플레이어가 점프를 합니다. 공중에 떠있을 때는 스페이스바를 눌러도 이중으로 점프하지 않네요. 성공입니다!


 

유니티 강좌 07. 플레이어 벽 끼임 현상 - Physics Material

지난 두 개의 강좌에서 2D 플랫포머 이동과 점프에 대해서 알려드렸습니다. 이제 충분히 플랫포머 게임의 기본을 갖추었지만 아직 한 가지 버그가 남아있습니다. 점프를 하거나 플랫폼에서 떨어

torotoblog.tistory.com