매일 업데이트
2023-08-13 18:15 8 min

Godot 게임에서 레벨을 만드는 방법

레벨 디자인은 게임의 매력을 증진시키는 핵심 요소입니다. 잘 구성된 레벨은 플레이어에게 지속적인 참여와 게임 진행 동기를 부여하는 구조와 도전을 제공합니다.

세심하게 디자인된 레벨은 플레이어에게 더욱 몰입감 있고 즐거운 경험을 선사할 수 있습니다. Godot 엔진을 사용하면, 초보 개발자든 숙련된 개발자든 상관없이 플레이어를 계속 끌어들일 수 있는 매력적인 레벨을 손쉽게 만들 수 있습니다.

Godot 게임 환경 설정

레벨 생성을 시작하기 전에 Godot 게임 엔진에서 2D 게임 프로젝트를 설정하는 것이 중요합니다.

본 문서에서 사용된 코드는 GitHub 저장소에서 MIT 라이선스 하에 무료로 이용 가능합니다.

새로운 장면을 만들고, 루트 노드로 Node2D 노드를 추가하십시오. 이는 장면 내 다른 모든 노드를 포함하는 컨테이너 역할을 합니다. 이제 프로젝트가 준비되었으므로, 플레이어 캐릭터를 장면에 추가할 차례입니다.

장면 패널에서 마우스 우클릭 후 '새 장면'을 선택하여 새 장면을 만듭니다. 그리고 CharacterBody2D 노드를 추가하여 플레이어 캐릭터를 표현합니다. CharacterBody2D 노드는 2D 캐릭터의 움직임과 충돌 감지를 위한 기능을 제공합니다.

CharacterBody2D 노드 내에 직사각형 모양의 CollisionShape2D 노드와 플레이어의 모습을 나타내는 Sprite 노드를 추가합니다.

플레이어 캐릭터와 시각적인 요소가 설정되었으므로, 이제 첫 번째 레벨을 만드는 데 집중할 수 있습니다.

두 개의 레벨 구성하기

Godot에서 레벨을 만들 때, 각각의 레벨을 개별적으로 나타내는 장면 파일(.tscn)을 사용할 수 있습니다. 이를 통해 각기 다른 레이아웃과 움직이는 플랫폼을 갖춘 두 가지 레벨을 구현할 수 있습니다.

플레이어 코드

CharacterBody2D 스크립트는 사용자의 입력에 따라 플레이어의 움직임을 제어합니다. 제공된 GDScript 코드를 통해 키보드 입력에 따른 이동 방향을 계산하고, 그에 맞춰 플레이어의 속도를 설정할 수 있습니다.

플레이어의 속도는 이동 속도를 결정하며, `move_and_collide` 함수는 충돌 감지를 처리합니다.

 extends CharacterBody2D

var speed = 300

func _physics_process(delta):

var input_dir = Vector2.ZERO

if Input.is_action_pressed("ui_left"):

input_dir.x -= 1

if Input.is_action_pressed("ui_right"):

input_dir.x += 1

if Input.is_action_pressed("ui_up"):

input_dir.y -= 1

if Input.is_action_pressed("ui_down"):

input_dir.y += 1

velocity = input_dir.normalized() * speed

move_and_collide(velocity * delta)

플랫폼 코드

Platform 스크립트는 StaticBody2D를 상속받아, 특별한 움직임이 없을 시 플랫폼이 움직이지 않도록 합니다. `move_speed` 변수를 사용하여 플랫폼의 이동 속도를 조절할 수 있습니다.

플랫폼은 지정된 범위(예시에서는 100부터 400 사이의 단위) 내에서 수평으로 앞뒤로 움직입니다. 경계에 도달하면 이동 방향을 반대로 변경합니다.

 extends StaticBody2D

const move_speed = 100

var move_direction = Vector2(1, 0)

func _physics_process(delta):

var platform_movement = move_direction * move_speed * delta

translate(platform_movement)

if position.x > 400 or position.x < 100:

move_direction *= -1

이러한 스크립트를 활용하여 플랫폼에 다채로운 움직임 패턴을 구현하고, 플랫포머 게임에서 흥미로운 플레이 경험을 디자인할 수 있습니다.

레벨 연결하기

일반적인 게임에서는 플레이어가 한 레벨에서 다른 레벨로 자연스럽게 이동하기를 원할 것입니다. 이를 위해 플레이어가 화면 경계를 벗어날 때 레벨 전환을 처리하는 레벨 관리자 스크립트를 구현해야 합니다.

레벨 관리자 스크립트는 현재 레벨 번호와 화면 크기를 추적합니다. `_ready()` 함수에서 초기 레벨(레벨 1)을 로드합니다. `load_level` 함수는 레벨 번호를 입력으로 받아 해당 장면 파일의 경로를 생성하고 레벨의 장면을 인스턴스화합니다.

새로운 레벨을 레벨 관리자의 자식으로 추가합니다. 이렇게 함으로써 현재 레벨을 효과적으로 전환할 수 있습니다.

 extends Node2D

var level_number = 1

var screen_size = Vector2()

var is_switching_level = false

func _ready():

screen_size = get_viewport_rect().size

load_level(level_number)

func load_level(level):

var level_path = "res://Level" + str(level) + ".tscn"

var level_scene = load(level_path)

var level_instance = level_scene.instantiate()

add_child(level_instance)

is_switching_level = false

func switch_level():

if is_switching_level:

return

is_switching_level = true

level_number += 1

if level_number > 2:

level_number = 1

var player = get_node("Node2D/Player")

if player:

var player_position = player.position

if player_position.x < 0:

player.position.x = screen_size.x

elif player_position.x > screen_size.x:

player.position.x = 0

elif player_position.y < 0:

player.position.y = screen_size.y

elif player_position.y > screen_size.y:

player.position.y = 0

get_node("Node2D").queue_free()

load_level(level_number)

func _process(delta):

var player = get_node("Node2D/Player")

if player:

var player_position = player.position

var condition1 = player_position.x < 0

var condition2 = player_position.x > screen_size.x

var condition3 = player_position.y < 0

var condition4 = player_position.y > screen_size.y

if condition1 or condition2 or condition3 or condition4 :

switch_level()

레벨 관리자를 구현하면 레벨 간의 원활한 전환과 레벨 간의 플레이어 데이터 유지가 가능해져, 부드러운 게임 경험을 제공할 수 있습니다.

추가 기능 통합하기

레벨을 만들 때 게임에 다양한 기능을 추가하여 플레이어에게 더욱 매력적이고 흥미진진한 경험을 제공할 수 있습니다.

수집 요소

코인, 별, 열쇠 등 플레이어가 수집할 수 있는 아이템을 추가하여 새로운 영역을 잠금 해제하거나 보상을 받을 수 있도록 합니다. 이러한 수집 요소는 탐험을 장려하고 게임 플레이에 추가적인 도전을 더해줍니다.

각기 다른 행동과 움직임 패턴을 가진 적을 도입합니다. 적은 플레이어가 극복해야 할 장애물을 만들어 게임에 전략과 재미를 더합니다.

파워 업

속도 증가, 무적, 공격력 강화 등 플레이어 능력을 일시적으로 향상시키는 파워 업을 포함합니다. 파워 업은 플레이어에게 힘을 실어주는 순간을 제공하고, 어려운 구간을 통과하는 데 도움을 줄 수 있습니다.

퍼즐

플레이어가 레벨을 진행하기 위해 해결해야 하는 퍼즐 요소를 디자인합니다. 퍼즐은 게임 플레이에 지적인 측면을 더하고, 플레이어가 퍼즐을 해결했을 때 성취감을 느끼게 합니다.

이러한 추가 기능을 레벨에 통합하여 플레이어를 매료시키고 게임 세계에 몰입하게 만드는 풍부하고 다양한 게임 경험을 만들 수 있습니다.

레벨 생성 모범 사례

레벨을 만들 때 특정 모범 사례를 염두에 두면 플레이어에게 잘 구성되고 즐거운 경험을 제공하는 데 도움이 될 수 있습니다.

난이도 균형

레벨 전체에 걸쳐 부드러운 난이도 곡선을 유지해야 합니다. 플레이어를 압도하지 않으면서 점진적으로 난이도를 높여 참여를 유지하세요. 새로운 메커니즘과 과제를 점진적으로 도입하여 플레이어가 적응하고 배울 수 있도록 합니다.

탐험 장려

플레이어가 탐험할 수 있는 숨겨진 경로, 비밀, 선택적 영역을 레벨 디자인에 포함해야 합니다. 탐험을 통해 플레이어에게 보너스, 수집 요소, 지름길을 보상하여 게임 플레이에 깊이를 더할 수 있습니다.

테스트 및 반복

레벨을 광범위하게 테스트하여 문제, 버그 또는 불균형을 확인해야 합니다. 플레이어 피드백을 기반으로 레벨 디자인을 반복하여 전체적인 경험을 개선합니다.

시각 및 오디오 요소

레벨의 시각적, 청각적 측면에 주의를 기울여야 합니다. 매력적인 그래픽과 저작권이 없는 음향 효과는 게임 분위기와 몰입도를 크게 향상시킬 수 있습니다.

레벨 흐름

레벨 흐름이 매끄럽고 논리적인지 확인해야 합니다. 명확한 시각적 신호로 플레이어를 레벨을 따라 안내하고, 막다른 길이나 혼란스러운 레이아웃을 피해야 합니다.

이러한 모범 사례를 따르면 플레이어가 즐길 수 있을 뿐만 아니라 게임 맥락 내에서 잘 설계되고 일관된 레벨을 만들 수 있습니다.

레벨 디자인은 Godot 게임을 더욱 매력적으로 만듭니다.

레벨은 Godot 게임을 플레이어에게 더욱 매력적으로 만드는 데 핵심적인 역할을 합니다. 잘 디자인된 레벨은 플레이어가 계속 플레이하도록 유도하며, 진행, 성취감, 탐험을 통한 재미를 제공합니다.

레벨 디자인 원칙을 이해하고, Godot의 기능을 활용하며, 추가 기능을 구현함으로써 플레이어를 사로잡는 레벨을 만들고 게임을 한 단계 더 끌어올릴 수 있습니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.