07/28 2D Platformer 게임의 구성 및 스크립팅

심지태
∙∙조회 6

속도로 움직이기: velocity

velocity는 Rigidbody2D가 현재 X축과 Y축 방향으로 얼마나 빠르게 움직이고 있는지를 나타내는 Vector2 값이다. 2D 플랫포머에서는 X축 속도를 플레이어 입력으로 제어하고, Y축 속도는 중력과 점프에 맡기는 방식으로 각 축을 독립적으로 관리한다.

항목설명예시
velocity.x좌우 이동 속도x * moveSpeed
velocity.y상승·낙하 속도중력 또는 jumpPower
좌우 이동Y축 속도를 유지하고 X축만 변경new Vector2(x * moveSpeed, rb.velocity.y)
점프X축 속도를 유지하고 Y축만 변경new Vector2(rb.velocity.x, jumpPower)
주의점속도 전체를 덮어쓰면 중력이나 점프 속도가 사라질 수 있음변경하지 않을 축의 기존 값을 보존

플랫포머에서는 MovePosition보다 속도(velocity)를 직접 다루는 방식이 더 자연스럽다. 중력이 만드는 낙하 속도와 조작이 만드는 이동 속도를 축별로 나눠 관리할 수 있기 때문.

csharp
// 좌우 이동
rb.velocity = new Vector2(x * moveSpeed, rb.velocity.y);
csharp
// 점
if (Input.GetKeyDown(KeyCode.Space))  
    rb.velocity = new Vector2(rb.velocity.x, jumpPower);

바닥 판정: Ground Check와 LayerMask

바닥 판정의 아이디어는 단순합니다. 플레이어 발밑에 작은 원을 두고, 그 원이 바닥과 겹치는지 검사합니다.

ini
bool isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.15f, groundLayer);

Physics2D.OverlapCircle은 지정한 위치를 중심으로 보이지 않는 원형 범위 안에 특정 Collider2D가 있는지 검사하는 함수입니다.

재료만드는 법
groundCheck플레이어의 자식으로 빈 오브젝트를 만들어 발밑에 배치
0.15f검사 원의 반지름. Scene에서 감이 안 오면 값을 키워 실험
groundLayerLayerMask. 바닥으로 인정할 레이어만 지정

LayerMask 준비:

  1. 바닥과 발판 오브젝트의 Layer를 Ground로 지정합니다 (없으면 Add Layer로 만듭니다).
  2. 스크립트의 groundLayer 드롭다운에서 Ground만 체크합니다.

카메라 추적: 따라오는 시선

예시 코드

csharp
public class CameraFollow : MonoBehaviour  
{  
    [SerializeField] private Transform target;  
    [SerializeField] private float smoothSpeed = 5f;

    void LateUpdate()  
    {  
        Vector3 wanted = new Vector3(target.position.x, target.position.y, -10f);  
        transform.position = Vector3.Lerp(transform.position, wanted, smoothSpeed * Time.deltaTime);  
    }  
}
  • LateUpdate는 모든 Update가 끝난 뒤 호출됩니다. 플레이어가 움직인 다음에 카메라가 따라가야 떨림이 없습니다.
  • Lerp는 현재 위치에서 목표 위치로 조금씩 다가가는 함수입니다. smoothSpeed가 클수록 바짝 붙습니다.
  • z를 -10으로 고정하는 이유는 2D 카메라가 장면 앞에 있어야 하기 때문입니다.

코요테 타임

코요테 타임은 캐릭터가 발판에서 떨어진 직후에도 잠깐 점프할 수 있게 해주는 기능입니다.
플레이어의 입력이 아주 조금 늦어도 점프가 성공하도록 보정해 줍니다.
보통 0.1초 안팎으로 설정하며, 조작감을 더 부드럽고 관대하게 만듭니다.