본문 바로가기

유니티

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

저번에는 탑뷰 형식의 게임에 사용될 플레이어 상하좌우 이동에 대해서 알려드렸습니다. 하지만 마리오, 소닉, 테라리아 같은 플랫포머 게임을 만들 때는 중력이 적용된 좌우 이동이 필요합니다. 이번 강좌에서는 리지드바디와 Velocity() 함수를 사용해서 중력이 적용된 이동을 구현해 보도록 하겠습니다.


 

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

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

torotoblog.tistory.com

 

유니티 강좌 05. 화면 흔들림 효과

게임 속에는 다양한 효과들이 적용되어 있습니다. 일반적으로는 알지 못하는 효과이더라도 모두 게임을 역동적으로 만들어주는 중요한 역할을 하고 있죠. 그 중 하나가 바로 화면 흔들림 효과

torotoblog.tistory.com


플랫폼 게임과 같은 느낌을 주기 위해 플레이어와 땅 오브젝트를 만들었습니다. 이제 이 땅 위에서 플레이어가 좌우로 움직일 수 있도록 해 봅시다.

플레이어한테 중력을 적용시키면 플레이어는 기본적으로 아래를 향해서 떨어지게 됩니다. 그렇기 때문에 땅 오브젝트가 플레이어가 밟을 수 있는 오브젝트라고 알려줘야 하는데요, Box Collider를 땅 오브젝트에 적용시켜주면 플레이어가 문제 없이 밟을 수 있게 됩니다. 콜라이더(Collider)는 충돌을 감지하는 역할을 하는 컴포넌트입니다. 플레이어한테도 적용시킬 콜라이더가 땅에 적용된 콜라이더와 부딪히면 유니티는 두 객체가 부딪힌 것을 인식하고 서로 뚫고 지나갈 수 없게 막습니다. 이 원리로 플레이어가 땅을 밟고 서 있을 수 있게 되는거죠. Box Collider 2D라는 컴포넌트를 찾아서 땅 오브젝트에 적용시켜 줍시다.

제일 먼저 플레이어가 중력을 가질 수 있도록 리지드바디를 적용시켜 줍시다. Rigidbody 2D 컴포넌트를 적용시켜주고 2D 게임이기 때문에 Z 축으로 회전하지 않도록 Constraints > Freeze Rotation 의 Z 축을 체크해 줍시다. 다음으로는 땅과 마찬가지로 콜라이더를 추가해 줍시다. 플레이어 역시 Box Collider 2D를 추가해 주시면 됩니다. 마지막으로 플레이어가 움직일 수 있도록 PlayerMovement 스크립트를 만들어서 적용시켜 줍시다. 

using UnityEngine;

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

    private Rigidbody2D rb;

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

    private void FixedUpdate()
    {
        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 Flip()
    {
        facingRight = !facingRight;
        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
    }
}

전체 코드입니다. 하나씩 살펴보죠.

public float speed;
private float moveInput;
private bool facingRight = true;
private Rigidbody2D rb;

이번에 사용할 변수는 저번 플레이어 이동 때랑은 살짝 다릅니다. 플레이어의 이동 속도인 speed와 좌우 입력을 감지할 moveInput, 플레이어가 바라보고 있는 방향을 나타내는 facingRight, 그리고 리지드바디 rb를 변수로 사용합니다.

*Start() 함수는 이전 강좌에서도 나왔던 내용들이라 스킵하겠습니다. 

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

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

저번에는 키보드 인풋을 벡터 형식으로 저장했습니다. 상하와 좌우 두 값을 저장해야 했기 때문인데요, 이번에는 좌우 하나만 저장하면 되기 때문에 float 형식을 사용합니다. 인풋을 가져오는 방식은 저번과 동일하니 따로 설명드리지 않아도 되겠죠? 인풋을 가져왔으면 바로 플레이어를 이동시키야겠죠. 이번에는 Rigidbody.Velocity() 함수를 사용할 겁니다. Velocity() 함수는 x, y 값을 받는 벡터 형식입니다. 저희는 좌우 이동, 즉 x축으로만 힘이 가해지면 되기 때문에 x 값에 moveInput * speed 만큼의 힘을 가해주고 y 축은 오브젝트가 가지고 있는 현재 속도, rb.velocity.y를 그대로 가져갈 수 있도록 해 줍시다.  

이제 마지막 if() 문을 한 번 살펴보도록 합시다. 이 부분은 플레이어가 움직이는 방향을 바라볼 수 있도록 해주는 코드입니다. facingRight 변수는 플레이어가 오른쪽을 바라보고 있으면 참, 왼쪽을 바라보고 있으면 거짓 값을 가지게 되는데요, 이걸 인풋 값과 비교해서 방향이 서로 다르다면 플레이어가 반대로 된 방향을 바라보고 있다는 뜻이기 때문에 뒤집어줘야 합니다. 플레이어를 뒤집기 위해서 Flip()이라는 새로운 함수를 만들어 주도록 하겠습니다.

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

같은 내용의 동작을 반복적으로 사용하게 될 때는 지금처럼 새로운 함수를 만들어서 사용하는 것이 좋습니다. 함수를 사용하면 코드의 전체적인 길이도 짧아지고, 오류가 있더라고 함수 내에서 한 번만 고치면 되기 때문에 더 효율적이죠. 함수를 만드는 방법은 매우 간단합니다. 공개/비공개(public/private) 여부를 정하고 어떤 데이터를 반환할지, 함수의 이름, 그리고 만약 매개로 받아올 변수가 있다면 매개 변수까지 선언해 주면 끝입니다. 이번 Flip() 함수의 경우 아무거도 반환하지 않는 void 형식의 private 함수입니다.

함수 속 내용을 살펴봅시다. 일단 이 함수가 호출됐다는 것은 플레이어가 방향 전환을 한다는 뜻입니다. 그렇기 때문에 facingRight의 값을 반대로 돌려야겠죠. !을 사용해서 값을 손쉽게 뒤집을 수 있습니다. 그 다음으로는 오브젝트를 직접적으로 뒤집어 줘야 하는데요, 오브젝트의 스케일(Scale) x 값에 -1을 곱해서 뒤집으면 되겠죠. 다만 유니티에서 scale을 직접적으로 수정할 수는 없기 때문에 벡터로 변환한 뒤 수정하고 다시 적용시켜주는 과정을 거쳐야 합니다. 아래 3 줄이 그 동작을 하는 코드죠.

이제 다시 유니티로 돌아와서 속도 값을 입력해 줍시다. 저는 5 정도로 하겠습니다.

유니티 중앙 상단에 있는 플레이 버튼을 클릭해서 게임을 실행해 줍시다. 처음에는 중력에 의해 떨어지다가 바닥에 닿으니 잘 서 있네요. 방향 키를 눌러보면 좌우로도 잘 움직입니다. 성공이네요!


 

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

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

torotoblog.tistory.com