본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(7) - 2D 플랫포머 게임 만들기(2)

by jyppro 2023. 4. 26.

2D 플랫포머 게임 만들기(2)

 

저번 시간에 이어서 2D 플랫포머 게임을 제작해 보겠습니다. 저번에는 게임의 설계방식을 통해 가장 먼저 해야할 오브젝트 배치, 컨트롤러 스크립트를 통한 오브젝트 움직이기 까지 진행하였습니다.

 

저번에 진행했던 내용에 이어서 진행하겠습니다. 우선 플레이어에 적용한 Rigidbody2D는 물리엔진 같은 개념이기 때문에, 중력이 작용합니다. 그렇기 때문에 이전 코드를 그대로 플레이어에 적용하고 실행시키면, 방향키를 통해 플레이어를 움직이지 않아도 자동으로 밑으로 천천히 내려가는 모습을 볼 수 있습니다.

 

하지만 이전에 저희가 했던 컨트롤러 코드는 단순히 움직임만 구현하기 위해 작성한 것입니다. 이제부터는 플랫포머에 걸맞는 코드를 작성하며 플랫포머 게임을 만들어 나가보려 합니다.

 

간단한 예제를 보여드리기 위해 저는 2D 오브젝트 생성을 통해 플레이어로 사용할 사각형 오브젝트와 바닥으로 사용할 오브젝트를 만들겠습니다. 

 

오브젝트 생성
플레이어 오브젝트와 바닥으로 사용할 오브젝트 생성

 

플랫포머를 만들기 위해선 바닥을 밟으며 점프하거나 이동하는 동작을 수행해야 합니다. 그렇다면 이전에 작성했던 PlayerController 코드를 수정해야 합니다. 수정한 코드를 보시겠습니다.

 

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float jumpForce = 5f;

    private Rigidbody2D rb;
    private bool isGrounded = false;

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

    void FixedUpdate()
    {
        float moveDirection = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(moveDirection * moveSpeed, rb.velocity.y);

        if (moveDirection > 0)
        {
            transform.localScale = new Vector3(1f, 1f, 1f);
        }
        else if (moveDirection < 0)
        {
            transform.localScale = new Vector3(-1f, 1f, 1f);
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
            isGrounded = false;
        }
    }

    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }
}

 

코드를 간단하게 해석하면, 움직이는 속도와 점프할 힘을 정하고 Horizontal을 이용해 방향키를 사용한 좌우 움직임에 따라 플레이어를 움직이게 만들어 줍니다. 그리고 바닥에 닿아 있을 때 스페이스바를 누르면 점프하도록 해줍니다. 바닥에 부딪히는 처리는 OnCollisonEnter2D에서 해줍니다.

 

FixedUpdate()와 Update()의 차이에 대해 간단히 설명하면, FixedUpdate는 프레임을 기반으로 호출되는 Update 와 달리 Fixed Timestep에 설정된 값에 따라 일정한 간격으로 호출됩니다. 물리 효과가 적용된(Rigidbody) 오브젝트를 조정할 때 사용됩니다.

 

해당코드에서 주의해야 할 점은 바닥으로 사용할 오브젝트를 바닥 처리를 해줘야 합니다. 저는 태그를 이용하여 Ground태그를 가진 오브젝트라면 바닥이라고 판정하도록 하였습니다.

 

이렇게 코드를 작성한 후, 실행하면 플레이어는 중력에 의해 바닥에 닿게되고 밑으로 더이상 내려가지 않습니다. 그 상태에서 스페이스바를 통해 점프할 수 있고, 양옆으로 방향키를 통해 이동할 수 있습니다. 움직이는 속도와 점프파워는 퍼블릭으로 선언하였으니, 인스펙터 창에서 임의로 수치를 조정하여 적용시킬 수도 있습니다.

 

이렇게 플랫포머 게임의 기본 움직임은 끝났습니다. 다음은 코인 오브젝트를 먹고 그에 따라 점수가 올라가도록 하는 방법에 대해 이야기 하겠습니다. 감사합니다.