Godot 오픈소스 RPG 프로젝트의 아이템 및 장비 시스템 분석

Godot 엔진으로 개발된 오픈소스 턴제 RPG 예제인 godot-open-rpg는 전투 메커니즘 외에도 다양한 아이템과 장비 시스템을 포함하고 있다. 이 문서에서는 해당 시스템의 구조와 작동 방식, 그리고 게임 내에서 어떻게 활용되는지를 살펴본다.

아이템 관리 시스템 설계

게임 내 아이템은 src/common/inventory.gd 파일에 정의된 Inventory 클래스를 통해 관리된다. 이 클래스는 Godot의 Resource 기반으로 설계되어 데이터 저장 및 접근이 용이하다.

아이템 종류 정의

기본적으로 다음과 같은 아이템 유형이 지원된다:

enum ItemType { 
    KEY, 
    GOLD, 
    EXPLOSIVE, 
    FIRE_SPELL, 
    ICE_SPELL, 
    EARTH_SPELL 
}

각각의 아이템은 대응하는 텍스처 리소스와 연결되어 있으며, 다음과 같이 미리 로드된다:

const TEXTURES := {
    ItemType.KEY: preload("res://assets/items/key.atlastex"),
    ItemType.GOLD: preload("res://assets/items/coin.atlastex"),
    ItemType.EXPLOSIVE: preload("res://assets/items/bomb.atlastex"),
    ItemType.FIRE_SPELL: preload("res://assets/items/wand_red.atlastex"),
    ItemType.ICE_SPELL: preload("res://assets/items/wand_blue.atlastex"),
    ItemType.EARTH_SPELL: preload("res://assets/items/wand_green.atlastex")
}

핵심 기능 구성

Inventory 클래스는 아래와 같은 주요 함수들을 제공한다:

  • 아이템 추가: insert(type: ItemType, quantity: int = 1)
  • 아이템 제거: delete(type: ItemType, quantity: int = 1)
  • 보유 수량 확인: count_of(type: ItemType) -> int
  • 아이콘 가져오기: static func fetch_icon(type: ItemType) -> Texture
  • 상태 저장/복원: persist(), load_state()

또한, 아이템 변경 시 on_item_update 신호를 발생시켜 UI 등 다른 컴포넌트가 반응할 수 있도록 한다.

실제 사용 사례

플레이어는 여러 경로를 통해 아이템을 획득하거나 사용할 수 있으며, 각 동작은 별도 스크립트에서 처리된다.

보물상자 및 수집품

treasure_chest_interaction.gdpickup.gd 스크립트를 통해 상호작용 시 인벤토리에 아이템이 추가된다:

# 보물상자 상호작용 예시
if not reward_given:
    var inv = Inventory.load_state()
    inv.insert(reward_type, amount)
    reward_given = true

소모성 아이템 및 퀘스트 요소

열쇠와 같은 특정 목적의 아이템은 다음과 같이 소모된다:

# 문 열기 로직
var player_inventory = Inventory.load_state()
if player_inventory.count_of(Inventory.ItemType.KEY) > 0:
    player_inventory.delete(Inventory.ItemType.KEY, 1)

특수한 경우, 예를 들어 마법봉을 특정 위치에 배치해야 하는 퍼즐에서는 다음과 같은 코드가 사용된다:

# 마법봉 거치대 상호작용
var inventory = Inventory.load_state()
inventory.delete(required_item_id)
active_item_id = required_item_id
icon_renderer.texture = Inventory.fetch_icon(required_item_id)

전투력 강화 시스템

현재 구현된 장비 시스템은 간단하지만 캐릭터 능력치에 영향을 줄 수 있는 구조를 갖추고 있다. battler_stats.gd 파일에는 장비 착용 시 능력치가 변경될 수 있음을 암시하는 주석이 존재한다:

# 장비 착용 시 능력치 수정 적용
# 장비 해제 시 remove_modifier() 호출 필요

시스템 확장 가능성

기존 시스템은 새로운 아이템이나 고급 장비 시스템 도입에 유연하게 대응할 수 있도록 설계되었다.

새로운 아이템 추가 방법

기존 enum에 새로운 항목을 추가하고, TEXTURES 딕셔너리에 이미지를 등록하면 된다:

# inventory.gd 수정 예
enum ItemType { ..., POTION }

const TEXTURES := {
    ..., 
    ItemType.POTION: preload("res://assets/items/potion.atlastex")
}

향후 장비 시스템 개선 방향

  1. Item 클래스를 상속받는 Gear 클래스 생성하여 속성 부여
  2. Battler 클래스에 장비 슬롯 및 관리 메서드 추가
  3. 강화, 마법부여 등의 고급 기능 구현

이러한 구조 덕분에 개발자는 간단한 수집 요소부터 복잡한 장비 시스템까지 점진적으로 구축할 수 있다.

태그: godot gamedev RPG item-system equipment-system

7월 20일 19:05에 게시됨