Godot 엔진에서 2D 플레이어 캐릭터 생성하기

 지난 게시글에서 Godot 엔진 프로젝트를 새로 생성하고 루트 노드를 만든 다음, 임의로 배경 노드까지 생성했다. 이번 글에서는 플레이어 캐릭터를 생성해보려고 한다.


플레이어 노드 추가하기

플레이어 노드 추가
플레이어 노드 추가

이번에는 플레이어 노드를 추가해야 한다. 'Main'으로 이름 붙였던 'Node2D'의 자식 노드로 새로운 노드를 추가한다.


CharacterBody2D 노드 추가
CharacterBody2D 노드 추가

'새 Node 만들기' 창이 열리면 'CharacterBody2D'를 검색한다. 'CollisionObject2D' 하위의 'PhysicsBody2D' 하위에 위치해 있다. 충돌 오브젝트 중, 물리 몸체 중에서 캐릭터 몸체 노드로 분류 되어 있다고 보면 된다. 검색되지 않으면 버전 문제일 수 있다. 해당 버전은 4.4.1 버전이다.


player 노드
player 노드

추가한 'characterBody2D' 노드의 이름을 구분하기 쉽게 'Player'로 변경했다.


노드 설정 경고
노드 설정 경고

노드 설정 경고가 표시되는데, 충돌 설정을 아직 안 했기 때문이므로 신경 쓰지 않아도 된다.

'Player' 노드 하위에 새로운 노드 두 개를 추가해 줄 텐데, 하나는 충돌 모양을 지정하는 노드이고, 하나는 캐릭터의 외형을 표현하는 노드이다.


CollisionShape2D 노드 추가
CollisionShape2D 노드 추가

먼저 충돌 모양을 지정하는 노드를 추가하려면 Player 노드를 선택하고 'CollisionShape2D'를 검색해서 추가한다.


RectangleShape2D
RectangleShape2D

추가된 노드를 선택하면 인스펙터 패널의 'Shape' 항목에서 충돌 모양을 지정할 수 있다. 여기서는 사각형으로 지정하려고 '새 RectangleShape2D'를 클릭했다.


플레이어 노드 텍스쳐 색상 변경
플레이어 노드 텍스쳐 색상 변경

'Player'노드 안에 'Sprite2D'를 검색해서 추가하면 외형을 설정할 수 있다. 이미지를 불러와야 하지만 여기서는 일단 빨간 박스로 만들어 두겠다. 인스펙터 패널에서 'Texture'를 '새 CanvasTexture'를 선택해 추가해주고 'Visibility' 항목의 'Modulate'를 통해 색상을 변경해 주었다.


충돌 박스 크기 조정
충돌 박스 크기 조정

다시 충돌 노드로 돌아와서 인스펙터 패널의 'Transform'항목을 보면 'Scale'을 통해 크기를 조정할 수 있다. 충돌 박스는 뷰포트 상에서 청록색으로 표시되므로 외형 크기에 맞게 적절히 조절해준다. 참고로 'x', 'y' 글자를 클릭하고 좌우로 드래그하면 쉽게 크기를 조절할 수 있다.

이제 이동 스크립트와 카메라를 추가해주면 플레이어를 움직일 수 있는 상호작용을 구현해 플레이 할 수 있다.


이동 스크립트 추가

스크립트 붙이기
스크립트 붙이기

이제 짤막한 코드를 작성해야 하는데, 매우 간단하므로 걱정하지 않아도 된다. 일단 'Player' 노드를 우클릭해 '스크립트 붙이기'를 찾아 클릭한다.


노드 스크립트 붙이기
노드 스크립트 붙이기

'노드 스크립트 붙이기'창이 뜨는데 기본 설정 그대로 두고 '만들기'를 클릭한다.


player.gd
player.gd

화면 왼쪽 하단 즐겨찾기에 'player.gd'라는 파일이 생성된 모습을 볼 수 있다.


Script 탭
Script 탭

동시에 뷰포트가 'Script' 탭으로 전환되며 코드를 작성할 수 있는 창이 나타난다. 이 창에 다음의 코드를 그대로 작성한다.


extends CharacterBody2D
@export var speed = 200  # Inspector에서 속도 조정 가능
func _physics_process(delta):
    var velocity = Vector2.ZERO
    if Input.is_action_pressed("ui_right"):
        velocity.x += 1
    if Input.is_action_pressed("ui_left"):
        velocity.x -= 1
    if Input.is_action_pressed("ui_up"):
        velocity.y -= 1
    if Input.is_action_pressed("ui_down"):
        velocity.y += 1
    velocity = velocity.normalized() * speed
    move_and_collide(velocity * delta)

move_and_collide()는 Godot 엔진의 기본적인 충돌 처리 방식이다.


이동 스크립트 작성
이동 스크립트 작성

스크립트를 작성하고 다시 '2D' 탭을 클릭하면 뷰포트를 이전 화면으로 돌릴 수 있다.


카메라 추가

Camera2D 노드 추가
Camera2D 노드 추가

'Player' 노드를 다시 선택하고 'Camera2D'라는 노드를 추가한다.


카메라 인스펙터
카메라 인스펙터

그럼 위 이미지와 같이 인스펙터가 설정되어 있는데 그대로 두면 시점이 플레이어에 고정되어 있다.


뷰포트 카메라 영역
뷰포트 카메라 영역

뷰포트에 나타난 분홍색 선의 박스가 카메라가 비추는 영역이다.


배경 노드 색상 변경
배경 노드 색상 변경

기존 하얀 배경 그대로 두면 플레이어가 움직여도 움직였는지 확인이 불가능하니 그라디언트로 변경해주었다.

이제 저장한 뒤 'F5'를 누르면 게임이 실행된다.


게임의 화면이 작다면, 상단 메뉴의 '프로젝트'-'프로젝트 설정'-'표시'-'창'에서 뷰포트의 너비와 높이를 조정하면 된다. 게임 화면의 모드도 여기서 풀스크린으로 변경할 수 있다.


댓글

이 블로그의 인기 게시물

전체 화면으로 현재 시간 보여주는 웹 시계 사이트 Bonfire Clock

블렌더 3D 카툰 렌더링으로 웹툰 배경 만들기

블렌더 3D에서 침대 모델링하는 방법