[Unity 2D] Portal 같은 게임 만들기 #1 플레이어 움직임 구현.
제가 정말 좋아하는 게임 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 게임에서 가장 중요한 포탈 매커니즘을 구현해보도록 하겠습니다!