게임 개발의 핵심 요소 중 하나인 레벨 생성은 플레이어에게 구조와 도전을 모두 제공하여 전반적인 경험을 향상시키는 데 필수적인 역할을 합니다. 이를 통해 플레이어가 게임 내에서 계속 몰입하고 전진할 수 있도록 유도합니다.

복잡한 레벨을 전문적으로 디자인함으로써 게이머에게 더욱 흥미롭고 만족스러운 경험을 제공할 수 있습니다. 초보자이든 노련한 게임 제작자이든 상관없이 Godot은 플레이어가 몇 번이고 다시 돌아오게 만드는 매혹적인 레벨을 개발하는 과정을 단순화합니다.

고닷 게임 설정하기

고닷 게임 엔진에서 레벨을 개발하기 전에 2D 게임 프로젝트를 올바르게 설정하고 구성하는 것이 필수적입니다.

이 출판물에서 사용된 코드는 MIT 라이선스 조건에 따라 자유롭게 액세스 및 라이선스가 부여되는 GitHub 저장소를 통해 액세스할 수 있습니다.

디지털 플랫폼에서 새로운 시각적 표현을 구성하는 프로세스를 시작하려면 다양한 그래픽 요소를 배치할 수 있는 3차원 공간을 통합하여 초기 단계를 설정합니다. 추가 구성 요소를 추가할 수 있는 기본 궤적을 도입함으로써 추가 개발을 진행할 수 있는 토대를 구축합니다. 이러한 기본 인프라가 구축되면 내러티브의 중심이 되는 주인공을 도입할 수 있으며, 이를 통해 사용자는 플레이어 캐릭터의 행동을 제어하여 가상 환경과 상호작용할 수 있게 됩니다.

씬 패널의 “새 씬” 옵션을 사용하여 Unity에서 새 씬을 생성한 다음 플레이어의 페르소나를 구현하기 위해 CharacterBody2D 컴포넌트를 추가하세요. 이 특정 요소에는 2차원 페르소나의 이동 및 충돌 감지와 관련된 고유한 기능이 탑재되어 있습니다.

CharacterBody2D 오브젝트의 파라미터 내에 플레이어의 신체적 속성을 시각적으로 표현하기 위해 직사각형 구성을 자랑하는 CollisionShape2D 컴포넌트와 수반되는 스프라이트 요소를 통합합니다.

플레이어 캐릭터의 외형과 기능에 대한 기초가 마련되었으므로 이제 게임플레이의 초기 단계 디자인으로 관심을 전환할 때입니다.

두 개의 레벨 생성

고닷이라는 게임 엔진 내에서 다양한 레벨을 설정하기 위해 특정 레벨의 개별 표현 역할을 하는 .tscn과 같은 별도의 파일 형식을 활용할 수 있습니다.총 두 개의 서로 다른 레벨을 통합하여 다양한 공간 배치와 움직이는 플랫폼과 같은 동적 기능을 도입하여 복잡성과 엔터테인먼트 가치를 더할 수 있습니다.

플레이어 코드

CharacterBody2D 스크립트를 실행하면 사용자 입력을 처리하여 키 누름에 반응하는 플레이어의 움직임을 결정할 수 있습니다. 주어진 GDScript를 사용하면 입력 키를 고려하여 이동 벡터를 계산한 다음 계산된 방향에 따라 캐릭터의 속도를 설정할 수 있습니다.

이 글도 확인해 보세요:  bcrypt를 사용하여 Node.js에서 비밀번호를 해시하고 확인하는 방법

플레이어의 속도는 진행 속도를 제어하고 충돌 감지는 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)

플랫폼 코드

플랫폼 스크립트는 StaticBody2D에서 파생되며, 이는 플랫폼이 운동학적 속성이 적용될 때까지 정지 상태를 유지한다는 것을 의미합니다. 따라서 이동\_속도 속성을 활용하여 플랫폼의 이동 속도를 조절할 수 있습니다.

플랫폼은 주어진 인스턴스에서 100~400단위 범위의 미리 정해진 운동 범위 내에서 측면으로 진동합니다. 경계에 부딪히면 진행 방향을 변경합니다.

 # Platform Movement
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)

    # Change direction when reaching the edge of the platform's path
    if position.x > 400 or position.x < 100:
        move_direction *= -1

이러한 스크립팅 툴을 활용하면 플랫폼에 맞는 매력적인 모션 프로파일을 개발하고 플랫포머 타이틀 내에서 자극적인 게임플레이 시나리오를 제작할 수 있습니다.

레벨 연결하기

몰입도 높은 게임 경험을 위한 전제 조건은 플레이어가 게임을 진행하면서 레벨 간 전환이 원활해야 한다는 것입니다. 이 과정을 원활하게 진행하려면 플레이어가 화면 경계를 넘어가는 것을 감지하면 자동으로 레벨을 전환하는 레벨 관리자 스크립트를 통합하는 것이 좋습니다.

레벨 관리자 스크립트는 현재 레벨 인덱스와 디스플레이 치수의 인벤토리를 유지합니다. 준비()` 메서드에서 초기화할 때 시작 레벨(레벨 1)을 큐업합니다. 로드 레벨` 프로시저는 특정 레벨에 대한 숫자 참조를 받아 관련 씬 아카이브에 대한 경로를 조합하고 해당 레벨의 스테이지 세트를 소환합니다.

기존 레벨 매니저 계층 구조의 하위 엔티티인 레벨 매니저에 새 레벨을 추가하십시오. 이 작업을 수행하면 활성 레벨이 새로 추가된 레벨로 대체되어 변경됩니다.

 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

    # Assuming the player node is named "Player"
    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):
    # Check if the player crosses the screen boundary
    # Assuming the player node is named "Player"
    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()

레벨 매니저를 통합하면 다양한 스테이지를 매끄럽게 진행하면서도 필수적인 플레이어 정보는 그대로 유지하여 중단 없이 즐거운 게임 여정을 이어갈 수 있습니다.

이 글도 확인해 보세요:  GitHub Copilot을 다운로드하고 VS 코드와 함께 사용하는 방법

추가 기능 포함

게임 내에서 계층 구조를 구현하면 게이머의 매력과 흥미를 높여주는 다양한 매력적인 요소를 도입할 수 있습니다.

수집품

토큰, 천체, 패스키 등 열성적인 게이머가 새로운 구역에 접근하거나 만족감을 얻기 위해 수집할 수 있는 장신구를 통합합니다. 수집품의 존재는 정독에 동기를 부여하고 게임 경험에 추가적인 차원의 복잡성을 부여합니다.

다양한 행동과 이동 스타일을 가진 다양한 적을 포함시키는 것이 좋습니다. 이러한 적의 존재는 게이머의 전술적 통찰력에 도전하는 장애물로 작용하며 예측할 수 없는 특성으로 인해 스릴 요소를 증폭시킵니다.

파워업

게임 플레이 중에 플레이어의 능력을 일시적으로 향상시키는 파워업(이동 속도 향상, 공격 불가, 강력한 공격 기동 등)을 도입하는 것을 고려하세요. 이러한 파워업은 플레이어가 스스로 능력을 강화할 수 있는 기회를 제공하며, 게임 내 고난이도 통로를 극복하는 데 도움이 될 수 있습니다.

퍼즐

레벨을 진행하기 위해 지적 수수께끼를 풀어야 하는 복잡한 디자인 요소를 게임플레이에 통합합니다. 이러한 수수께끼 같은 도전 과제를 포함함으로써 게임 경험에 지적으로 자극적인 차원을 부여하고, 성공적으로 해결했을 때 플레이어로부터 승리의 감정을 이끌어냅니다.

레벨 디자인에 고급 기능을 통합하여 플레이어의 주의를 집중시키고 가상 세계에 대한 몰입도를 유지하는 복잡하고 다양한 게임 환경을 조성할 수 있습니다.

레벨 제작 모범 사례

게임플레이 레이어를 개발하는 동안 정해진 가이드라인을 준수하는 것은 게이머에게 특별하고 만족스러운 경험을 제공하는 데 매우 중요합니다:

균형 난이도

플레이어에게 즐거운 게임 경험을 제공하기 위해서는 게임의 모든 레벨에서 일관된 수준의 도전 과제를 유지하는 것이 중요합니다. 이는 처음부터 극복할 수 없는 난이도를 제시하기보다는 플레이어가 게임을 진행하면서 장애물과 적의 복잡성을 점차 증가시킴으로써 달성할 수 있습니다. 또한 새로운 메커니즘과 도전 과제를 점진적으로 도입하여 플레이어가 이러한 변화에 적응하고 그에 따라 기술을 개발할 수 있는 시간을 제공합니다. 개발자는 난이도를 신중하게 조정함으로써 플레이어가 좌절하거나 지루함을 느끼지 않도록 하면서 몰입도와 만족도를 높일 수 있습니다.

이 글도 확인해 보세요:  JES를 활용한 흥미로운 사운드 처리 기법 3가지

탐험 장려

레벨 디자인에 미묘한 통로, 숨겨진 요소, 대체 경로를 통합하는 것을 고려하세요. 보너스 아이템, 특별한 수집품 또는 시간을 절약할 수 있는 대안과 같은 인센티브를 제공하여 탐험을 장려하세요. 이러한 접근 방식은 복잡성을 더하고 경험을 더 깊이 파고드는 사람들에게 보상을 제공합니다.

테스트 및 반복

모든 레벨에 대한 종합적인 테스트를 수행하여 기술적 어려움이나 불균형한 게임플레이와 같은 단점을 파악합니다. 플레이어의 입력을 활용하고 그에 따라 레이아웃을 조정하여 더욱 매력적인 게임 경험을 제공합니다.

시각 및 오디오

레벨의 시각적 요소와 청각적 요소는 플레이어에게 몰입감 있는 게임 경험을 제공하는 데 중요한 역할을 하므로 세심한 주의를 기울여야 합니다. 고품질 그래픽과 엄선된 음향 효과를 사용하면 게임의 전반적인 분위기를 크게 향상시켜 사용자에게 더욱 매력적이고 즐거운 게임을 제공할 수 있습니다.

레벨 흐름

효과적인 시각적 단서를 사용하여 플레이어가 목표를 향해 점진적으로 나아가도록 유도함으로써 레벨 전체에서 매끄럽고 일관된 진행을 위해 노력합니다. 플레이어의 경험을 방해할 수 있는 통과할 수 없는 장벽이나 혼란스러운 배치와 같은 혼란스러운 디자인 요소를 피하세요.

이러한 권장 접근 방식을 따르면 게임의 전반적인 내러티브 또는 주제와 높은 수준의 디자인 품질과 일관성을 유지하면서 동시에 즐거운 게임 경험을 제공하는 레벨을 개발할 수 있습니다.

고닷 게임의 몰입도를 높이는 레벨

레벨 디자인은 고닷 게임의 전반적인 플레이 경험을 향상시키는 데 매우 중요합니다. 효율적으로 제작된 레벨은 전진, 성취감, 발견의 느낌을 제공하여 게이머가 게임 플레이를 지속하도록 유도합니다.

레벨 디자인의 기본을 이해하고 고닷 리소스의 잠재력을 최대한 활용하며 고급 요소를 통합함으로써 플레이어의 흥미를 유발하고 게임의 전반적인 품질을 크게 향상시키는 매혹적인 레벨을 만들 수 있습니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.