게임 개발/유니티(Unity)

[Unity] 2D 캐릭터 이동

마달랭 2024. 12. 26. 16:22
반응형

개요

유니티에서 2D 캐릭터를 상하좌우로 이동시키는 방법에 대해 알아보자

  1. 캐릭터 스프라이트 배치
  2. Rigidbody 2D 추가 (물리 적용)
  3. Collider 2D 추가 (충돌 처리)
  4. 캐릭터 이동 스크립트 작성

위 순서대로 적용을 한다면 게임 씬 내에서 플레이어가 상하좌우로 이동할 수 있게 된다.

 

 

스프라이트 배치

  1. 캐릭터 스프라이트를 씬에 드래그해 배치한다.
  2. Hierarchy에서 캐릭터 이름을 player로 변경한다.

굳이 player가 아닌 다른 무언가로 변경하여도 상관이 없다.

스프라이트를 배치해야 씬 내부에서 플레이어를 식별할 수 있게 된다.

나는 우선 검정색 박스를 플레이어로 설정하였다.

 

 

Rigidbody 2D

  1. Player를 선택하고 Inspector에서 Add Component 클릭
  2. Rigidbody 2D 추가
  3. Gravity Scale을 0으로 설정 (중력 제거)

위에서 스프라이트를 추가해 생성한 player에 컴포넌트를 추가해 주어야 한다.

타일의 이동 불가 지역을 갈 수 없게 하기 위해서는 꼭 필요한 컴포넌트이다.

Gravity Scale을 0으로 설정하지 않을 경우 player가 아래로 쭉 추락하는 모습을 볼 수 있다.

 

 

Collider 2D

 

  1. Player를 선택하고 Inspector에서 Add Component 클릭
  2. Collider 2D 추가 (캐릭터 충돌 범위 설정)

이제 물리가 적용될 범위를 지정해 주어야 한다.

Collider은 Box, Circle, Polygon등의 형식이 있다.

말 그대로 충돌 반경을 박스, 원, 다양한 형태로 만들 수 있게 해주는 컴포넌트이다.

원하는 Collider을 선택하여 충돌 반경을 조절해 주면 된다, 나는 Circle로 설정하였다.

 

 

스크립트 작성

 

 

  1. Assets에서 우클릭 -> Create -> C# Script 클릭
  2. 적당한 파일명으로 설정
  3. 스크립트를 더블 클릭해 열고, 코드 작성 후 저장

캐릭터의 이동을 구현하기 위한 스크립트를 작성하고 해당 오브젝트에 할당해 주어야 한다.

아래에 예제 코드를 공유한다.

 

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

public class PixelPerfectMovement : MonoBehaviour
{
    public float moveSpeed = 4f;  // 초당 픽셀 이동 거리
    public int pixelsPerUnit = 32; // 타일 크기
    private Vector2 movement;

    void Update()
    {
        // 방향키 입력
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = Input.GetAxisRaw("Vertical");

        // 대각선 이동 방지
        if (movement.x != 0) movement.y = 0;
    }

    void FixedUpdate()
    {
        if (movement != Vector2.zero)
        {
            Vector3 newPosition = transform.position + (Vector3)movement * moveSpeed * Time.fixedDeltaTime;
            newPosition.x = Mathf.Round(newPosition.x * pixelsPerUnit) / pixelsPerUnit;
            newPosition.y = Mathf.Round(newPosition.y * pixelsPerUnit) / pixelsPerUnit;
            transform.position = newPosition;
        }
    }
}

 

 

위 스크립트를 작성해 주면 상하좌우 방향키로 캐릭터를 움직일 수 있다.

타일 배치를 32x32 크기로 했으므로 이동 속도와 이동할 타일 크기를 알맞게 설정해 주면 된다.

작성된 스크립트를 저장한 후 유니티에서 player 오브젝트의 Inspector로 이동해 준다.

해당 스크립트를 Inspector에 드래그 앤 드랍으로 추가해 준다.

 

 

테스트

 

위 내용을 모두 적용하였다면, player 오브젝트의 Inspector에 위와 같이 세팅이 되었을 것이다.

이제 게임 모드로 진입하여 방향키를 입력 시 캐릭터가 움직이는 것을 볼 수 있다.

 

 

 

트러블 슈팅

1. 캐릭터가 보이지 않는 경우

타일맵에 가려 player의 위치가 보이지 않을 수도 있다.

그럴 땐 player의 Sprite Renderer에서 Order in Layer을 타일 맵 보다 높게 설정해 주면 된다.

이는 씬 혹은 게임 모드에서 보여지는 우선 순위를 나타낸다.

 

혹은 player 오브젝트의 위치가 카메라 위치 바깥에 존재할 수도 있다.

player의 위치가 카메라 범위 내에 있는지를 체크해 주자

 

2. 캐릭터가 움직이지 않는 경우

상하좌우 방향키로 캐릭터가 움직이지 않을 경우 스크립트에서 할당한 Pixels Per Unit이 배치한 타일 크기와 동일한지 체크해 주자

 

3. 충돌 처리가 되지 않는 경우

아직 타일에 대한 충돌 처리를 구현하지 않았으므로 충돌하지 않는 것은 당연하다.

카메라를 캐릭터에 고정하는 것과 충돌 처리를 하는 것은 다음글에서 작성해 본다.

 

728x90
반응형

'게임 개발 > 유니티(Unity)' 카테고리의 다른 글

[Unity] 2D 캐릭터 위치 변경  (0) 2024.12.27
[Unity] 오브젝트 네이밍 자동화  (0) 2024.12.27
[Unity] 2D 타일 충돌 처리  (0) 2024.12.26
[Unity] 2D 타일맵 배치  (1) 2024.12.26