Coding Feature.

[Unity 2D] Portal 같은 게임 만들기 #1 플레이어 움직임 구현. 본문

Toy Project/mini-portal [Unity2D]

[Unity 2D] Portal 같은 게임 만들기 #1 플레이어 움직임 구현.

codingfeature 2024. 1. 5. 15:00

제가 정말 좋아하는 게임 Portal을 Unity 2D Engine을 사용해서 만들어보기로 했습니다.

 

프로젝트 명은 "mini-portal"입니다.

 

우선 Unity 2D 프로젝트를 만들고, 사용될 Sprite 들을 불러왔습니다.

 

 

각각 Player 와 Ground로 이름을 지었습니다.

 

그 다음 Player와 Ground에 Box Collider 2D 속성을 집어넣어서 물체가 부딪히는 경우를 처리해주었습니다.

 

추가로 Player에는 RigidBody 2D 속성을 넣어서 물리적 특성을 부여하였습니다.

 

 

플레이 해보니 캐릭터가 게임에서 설정된 중력에 의해 내려와 플랫폼에 닿을 시 움직이지 않도록 되는 것을 확인할 수 있었습니다!

 

그 다음 플레이어의 움직임을 프로그래밍하기 위해 PlayerMovement.cs 파일을 생성하고 Player 오브젝트에 넣어주었습니다.

 

PlayerMovement.cs의 내용은 아래와 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    Rigidbody2D m_rb; // Player의 rigidbody.

    bool m_isGrounded; // Player가 땅에 붙어있는지 확인하는 Boolean.

    public float playerSpeed = 3.0f; // 움직임 속도.
    public float playerJumpForce = 10.0f; // 점프 시 힘.

    // Start is called before the first frame update
    void Start()
    {
        m_rb = GetComponent<Rigidbody2D>();
        m_isGrounded = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.A)){ // 좌로 이동.
            transform.Translate(Vector2.left * playerSpeed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.D)) // 우로 이동.
        {
            transform.Translate(Vector2.right * playerSpeed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.Space) && m_isGrounded) // 스페이스 바를 누르고, 땅에 있을 때.
        {
            m_rb.AddForce(transform.up * playerJumpForce); // rigidbody에 힘 추가.
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Ground")) // 땅에 붙어있을 경우,
        {
            m_isGrounded = true;
        }
    }

    void OnCollisionExit2D(Collision2D collision) // 땅으로부터 떠있는 경우,
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            m_isGrounded = false;
        }
    }
}

 

좌, 우 이동 시 Player의 transform 내 값을 Translate 해줌으로써 좌우로 이동하도록 했습니다.

 

그리고 점프를 구현하기 위해 rigidbody 에 AddForce 함수를 이용해서 힘을 위로 가해 올라가도록 했습니다.

 

다만, 위 내용으로만 구현한다면 플레이어가 계속해서 스페이스바를 누를 경우, 계속해서 올라갈 것입니다!

 

따라서 땅에 붙어 있을 때만 점프를 할 수 있도록 해주어야 합니다.

즉, Collision 속성을 사용해서 땅에 붙어있는지 아닌지를 파악해주는 기능이 있어야 합니다! (m_isGrounded)

 

OnCollisionEnter2D 함수를 사용해서 Player의 Box collider에 닿은 collision에 대해서 그 물체의 Tag가 "Ground"인 경우, m_isGrounded를 true로 만들어서 파악할 수 있습니다!

 

위 코드를 작성하고 Ground Sprite의 태그를 "Ground"로 설정하니 잘 작동하는 것을 확인하였습니다.

 

그 다음은 Portal 게임에서 가장 중요한 포탈 매커니즘을 구현해보도록 하겠습니다!