Godot 플러그인 소개 – 메뉴 생성기
1
Godot Radial Menu
전통적인 선형 리스트나 격자(Grid) 형태의 UI는 모바일 터치 환경이나 게임패드 아날로그 스틱 환경에서 조작 편의성과 직관성이 매우 떨어집니다. 게임패드로 8방향 중 하나를 부드럽게 가리키거나 모바일 터치로 특정 슬롯을 빠르게 스와이프 선택하는 방사형 메뉴(Radial Menu)를 구현하려면, 매번 수학적 삼각함수(Sin, Cos)를 사용한 자식 노드 좌표 연산, 드래그 각도 판정, 호버링 상태 셰이더 및 예외 처리를 밑바닥부터 코딩해야 하는 상당한 피로감이 따릅니다.\n\nGodot Radial Menu 플러그인은 GPU 가속을 받는 GDShader와 최적화된 GDScript를 통해 이러한 렌더링 및 각도 매핑 연산을 완벽히 공용 솔루션으로 자동화합니다. 개발자는 단지 노드를 씬 트리에 추가하고 자식 요소만 넣어주면 즉시 고성능 원형 조작 인터페이스를 완성할 수 있습니다.
1. Godot 에디터를 실행하고 상단 중앙의 'AssetLib' 탭으로 이동합니다.\n2. 검색창에 'Godot Radial Menu'를 검색하고 해당 에디터용 플러그인을 선택한 후 다운로드(Download) 및 설치(Install)를 진행합니다.\n3. 다운로드가 완료되면 상단 메뉴의 'Project' -> 'Project Settings' -> 'Plugins' 탭으로 순서대로 이동합니다.\n4. 목록에서 'Godot Radial Menu' 플러그인을 찾아 우측의 'Enable' 체크박스를 클릭하여 활성화하고 설정을 닫습니다.
씬 트리에 Control 계열의 ‘RadialMenu’ 노드를 추가한 후, 배치하고 싶은 자식 노드(예: TextureRect, Button 등)들을 그 하위에 추가합니다. RadialMenu 노드는 자식 노드들의 개수를 실시간으로 계산해 균등한 각도로 원형 정렬을 수행합니다. 인스펙터 뷰에서 Width Max(외경), Width Min(내경), Snap Enabled(슬롯 스냅 여부), Bevel Color 등의 익스포트 파라미터를 조정하여 실시간으로 도넛 형태의 디자인과 색상을 편집할 수 있습니다.
extends Control\n\n@onready var radial_menu = $RadialMenu\n\nfunc _ready():\n # 메뉴 아이템이 호버(선택 후보)되거나 클릭(확정)되었을 때 시그널 연결\n radial_menu.connect("hovered", Callable(self, "_on_item_hovered"))\n radial_menu.connect("selected", Callable(self, "_on_item_selected"))\n\nfunc _input(event):\n # 마우스 우클릭 시 마우스 포인터 중심에 메뉴 토글 처리 예시\n if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT:\n if event.pressed:\n radial_menu.global_position = event.global_position\n radial_menu.show()\n else:\n # 버튼을 놓았을 때 활성화된 아이템 선택 후 메뉴 숨김\n radial_menu.hide()\n\nfunc _on_item_hovered(child: Node):\n print("포커스된 아이템: ", child.name)\n\nfunc _on_item_selected(child: Node):\n print("최종 선택 완료: ", child.name)\n # 해당 아이템의 실제 효과 코드 실행
– **최고의 성능(GDShader 기반 렌더링)**: 정적인 텍스처 대신 GPU에서 직접 계산되는 실시간 셰이더를 사용하여 모바일 기기에서도 프레임 드랍 없이 극도로 가볍게 구동됩니다.\n- **멀티 플랫폼 입력 대응**: PC의 마우스 드래그는 물론 모바일 터치 드래그, 콘솔 게임패드의 아날로그 스틱 기울기를 매끄럽게 처리하는 수학적 벡터 연산이 완벽히 내장되어 있습니다.\n- **뛰어난 시각적 확장성**: 배경색, 포그라운드 강조 색상, 슬롯 스냅 동작 여부, 베벨 테두리 두께 등을 코드 한 줄 수정 없이 인스펙터창에서 즉각 조율 가능합니다.
– **하위 서브메뉴(Submenu) 미지원**: 본 플러그인은 단일 레이어 형태의 원형 고속 선택에 초점이 맞춰져 있어, 트리 형식의 깊은 하위 메뉴까지 펼치기 위해서는 추가적인 시나리오 연계 코드를 직접 짜야 합니다.\n- **표준 컨테이너 무시**: 노드 내부적으로 자식 노드들의 Rect 포지션을 삼각함수로 임의 강제 오버라이딩하여 강제 배치하므로, Godot의 표준 UI Anchor 및 Container 정렬 옵션들이 올바르게 작동하지 않을 수 있습니다.
HTML/웹 개발 환경과 비교하자면, 이 플러그인은 무겁고 직관성이 떨어지는 수평/수직의 `
- ` `
- ` 목록 구조를 탈피하여, 마치 CSS의 `transform: rotate()`와 삼각함수 좌표 계산을 통해 중심점을 360도로 완벽하게 정렬하는 ‘원형 메뉴 컴포넌트’와 같습니다. CSS Grid나 Flexbox가 사각형 영역을 제어한다면, Godot Radial Menu는 중심 기준의 극좌표계를 다룹니다. 또한, 수많은 원형 이미지 리소스를 불러오는 대신 HTML5 Canvas나 WebGL 셰이더를 이용해 연산만으로 외곽선(Bevel)과 호버 그라데이션을 실시간 렌더링하는 고성능 원형 슬라이더 UI 라이브러리를 사용하는 것과 동일합니다.
💡 에디터 최종 요약: Godot Radial Menu는 게임의 UI 연출력과 편의성을 프로급으로 끌어올려 주는 탁월한 메뉴 생성기입니다. 최적화된 셰이더 렌더링 덕분에 모바일이든 PC든 일관되게 고성능을 보장하며, 마우스와 게임패드 아날로그 조작을 단번에 정복할 수 있습니다. 퀵슬롯 무기 변경 휠, 이모티콘 선택창, 제작 레시피 링 등 직관적이고 세련된 사용자 경험을 제공하고 싶다면 반드시 여러분의 Godot 프로젝트에 임포트해 보세요!
2
Godot Game Settings
게임 개발 과정에서 디스플레이 해상도, 화면 모드, 오디오 볼륨, 그래픽 품질, 키 바인딩 등의 설정 메뉴를 구현하는 것은 단순 반복적이고 지루한 작업입니다. 매 세팅마다 변수를 선언하고, 데이터를 디스크(JSON, ConfigFile)에 직렬화하여 저장하고, 게임 구동 시 이를 다시 역직렬화하여 가져온 뒤, UI 컴포넌트(Slider, Checkbox, OptionButton)의 이벤트 시그널과 수동으로 바인딩해야 합니다. 이로 인해 보일러플레이트 코드가 기하급수적으로 늘어나며 휴먼 에러가 빈번하게 발생합니다. ‘Godot Game Settings’는 이러한 백엔드 영구 저장 로직과 UI 동기화 메커니즘을 완전히 자동화하여 해결합니다. 데이터 수정이 UI에 즉시 반영되고, 게임 실행 시 기존 데이터가 안정적으로 역직렬화 및 런타임에 자동 주입되어 개발자의 수작업 리소스를 극적으로 절약합니다.
1. Godot 에디터를 실행하고 에셋 라이브러리(AssetLib) 탭으로 이동합니다. 2. 'Godot Game Settings'를 검색한 후 선택하여 다운로드 및 설치를 진행합니다. (또는 공식 GitHub 저장소에서 플러그인을 다운로드하여 프로젝트 폴더 내부 'addons/godot-game-settings' 경로에 위치시킵니다.) 3. 프로젝트 설정(Project Settings) -> 플러그인(Plugins) 탭으로 이동하여 'Godot Game Settings' 옆의 'Enable' 체크박스를 선택해 활성화합니다.
플러그인을 활성화하면 에디터 상단에 ‘GGS’ 전용 편집기 탭이 추가됩니다. 이곳에서 마스터 볼륨, 전체 화면 전환, 키 바인딩과 같은 설정 항목을 시각적인 리소스로 정의할 수 있습니다. UI 디자인을 진행할 때는 플러그인이 제공하는 ‘ggsSlider’, ‘ggsCheckbox’, ‘ggsOptionButton’ 등의 전용 컴포넌트 노드들을 씬 트리에 배치한 뒤, 인스펙터(Inspector) 창의 ‘setting’ 속성에 원하는 리소스를 할당해주면 자동 바인딩됩니다. 게임을 시작할 때, 전용 싱글톤(ggsManager)이 자동으로 세이브 파일로부터 사용자 데이터를 파싱하여 리소스의 ‘apply()’ 함수를 호출해주므로 복잡한 초기화 과정을 간편하게 통합할 수 있습니다.
# res://settings/setting_custom_screenshake.gd\n@tool\nextends ggsSetting\n\nfunc apply(value: Variant) -> void:\n if value:\n GlobalSignals.emit_signal(\"set_screen_shake_enabled\", true)\n print(\"화면 흔들림 효과 활성화\")\n else:\n GlobalSignals.emit_signal(\"set_screen_shake_enabled\", false)\n print(\"화면 흔들림 효과 비활성화\")
1. **리소스 기반 설계:** 게임 설정을 Godot 고유의 리소스 객체로 다루어 시각적인 드래그 앤 드롭 바인딩과 뛰어난 모듈화가 가능합니다.\n2. **풍부한 기본 프리셋 제공:** 오디오 볼륨, 창 모드, V-Sync, 최대 FPS, 키 re-binding 등 게임에 필수적인 거의 모든 설정의 동작이 기본 템플릿으로 사전 구축되어 있습니다.\n3. **자동화된 JSON 영구 저장:** 사용자가 옵션 UI를 조작하는 즉시 로컬 디바이스의 JSON 파일 저장 공간에 변경 내역을 안전하게 암시적으로 직렬화합니다.
1. **자체 테마 및 스타일의 부재:** 오직 기능적 로직 컴포넌트만 지원하므로, 유려하고 수려한 디자인의 옵션 UI를 구축하기 위해서는 Godot의 테마(Theme) 및 컨트롤 노드 스타일을 개발자가 직접 다듬어 주어야 합니다.\n2. **특수 데이터 제어 시 코딩 필수:** 제공하는 기본 데이터 규격을 뛰어넘는 완전 커스텀 세팅이 필요할 경우, ggsSetting 스크립트를 상속받아 직접 수동으로 콜백 비즈니스 로직을 구현해야 합니다.
웹 개발의 관점에서 이 플러그인은 ‘React/Vue의 글로벌 상태 라이브러리(Redux/Pinia)와 LocalStorage를 완전 자동으로 동기화해주는 양방향 데이터 바인딩 훅’과 완벽히 동치입니다. 보통 웹 사이트에서 다크 모드 토글이나 음소거 기능을 구현할 때, 사용자가 스위치를 누르면 상태를 관리하고, 로컬스토리지에 수동으로 직렬화하여 저장하고, 첫 로드 시 파싱하는 일련의 수작업 흐름을 짜야 합니다. ‘Godot Game Settings’는 ‘다크 모드’라는 설정 리소스(전역 상태)를 정의하고, 전용 토글 UI 컴포넌트에 이 리소스를 드래그만 해두면 플러그인의 ggsManager 백엔드가 알아서 JSON 로컬 파일 입출력, 상태 변경 전파, 콜백 로직(웹에서의 CSS 토글 적용 등)까지 프레임워크 수준에서 원스톱으로 처리하는 혁신적인 바인딩 시스템입니다.
💡 에디터 최종 요약: 수작업으로 구현할 때 시간과 노력이 배로 소요되던 옵션 설정 기능들을 몇 분 만에 씬과 바인딩하여 완성시킬 수 있는 독보적인 유틸리티입니다. 데이터 관리의 정교함과 직관적인 에디터 GUI를 동시에 갖춘 ‘Godot Game Settings (GGS)’ 플러그인을 도입하여, 프로덕션 수준의 안정적인 옵션 메뉴를 신속하고 우아하게 구축해보세요!
3
Maaack’s Menus Template
게임 개발 시 메인 메뉴, 그래픽/오디오/입력 매핑 설정(옵션), 일시정지 메뉴, 크레딧, 씬 로더 등은 매 프로젝트마다 반복적으로 구현해야 하는 대표적인 번거로운 작업(Boilerplate)입니다. 특히 게임잼(Game Jam)이나 소규모 개발 환경에서 이러한 필수 UI 시스템을 기초부터 설계하는 것은 많은 시간과 노동력을 요합니다. ‘Maaack’s Menus Template’은 완벽하게 작동하는 반응형 UI 시스템을 단 15분 만에 세팅할 수 있도록 지원합니다. 게임의 해상도 조절(최대 4K에서 최소 640×360), 키보드/마우스 및 게임패드 입력 자동 매핑, 사운드/음악 볼륨 조절 설정 저장, 비동기 로딩 스크린 등을 사전에 모두 구축하여 개발자가 핵심 게임플레이 구현에만 집중할 수 있도록 돕습니다.
Godot 실행 → 상단 'AssetLib' 탭 선택 → 'Maaack's Menus Template Plugin' 검색 → 다운로드(Download) 클릭 → 'addons/' 폴더에 설치(Install) 클릭 → 에디터 재로드 → 프로젝트 설정(Project Settings) → 플러그인(Plugins) 탭 → 'Maaack's Menus Template' 활성화(Enable) → 자동 실행되는 셋업 위자드를 따라 기본 예제 파일들 복사 및 구성 완료.
플러그인이 성공적으로 활성화되면 프로젝트 메뉴 상단에 `Project > Tools > Run Maaack’s Menus Template Setup…` 메뉴가 나타납니다. 이 셋업 위자드를 실행하면, 플러그인 내에 내장된 기본 메뉴 씬과 구성 요소들이 프로젝트 폴더 외부(기본값은 프로젝트 루트)로 추출됩니다. 추출된 `main_menu_with_animations.tscn` 또는 `options_menu.tscn` 등 상속된 씬(Inherited Scenes)들을 원하는 디자인으로 변경한 뒤, `AppConfig` 자동 로드(Autoload) 싱글톤에서 메인 게임 및 오디오 컨트롤러 관련 변수 경로를 지정해 주면 연동이 완료됩니다.
# AppConfig 싱글톤 및 Maaack's Scene Loader와 연동하여 버튼 클릭 시 게임 씬을 부드럽게 로딩하는 예시 코드
extends Control
# 전환할 메인 게임 씬 경로 지정
@export_file("*.tscn") var game_scene_path: String = "res://scenes/gameplay/main_stage.tscn"
func _ready() -> void:
# 버튼 노드에 시그널 바인딩
$MenuButtons/PlayButton.pressed.connect(_on_play_button_pressed)
func _on_play_button_pressed() -> void:
# 플러그인에 내장된 전역 씬 로더(SceneLoader)를 사용해 페이드 아웃 애니메이션 및 비동기 진행률 표시 로딩을 적용하며 이동
if SceneLoader:
SceneLoader.load_scene(game_scene_path)
else:
get_tree().change_scene_to_file(game_scene_path)
– **원스톱 고품질 옵션 UI**: 마우스/키보드 및 게임패드 입력을 즉시 변경할 수 있는 입력 리매핑(Input Remapping)과 디스플레이 해상도 조절, 오디오 믹서 셋업이 완료되어 있습니다. – **상속 기반 맞춤 가공**: 모든 기본 씬들이 상속 가능한 구조로 되어 있어 플러그인 코어 파일을 직접 수정하지 않고도 게임 테마에 맞는 독창적인 디자인으로 업그레이드할 수 있습니다. – **게임 에디션에 맞춤 최적화**: 게임잼(Game Jam) 수준의 심플한 구성부터 4K 스케일의 고사양 상업용 타이틀까지 모두 완벽하게 커버하는 해상도 유연성을 가집니다.
– **복잡한 의존성 구조**: 옵션 설정, 앱 구성(AppConfig), 씬 로더 등 여러 하위 컴포넌트가 싱글톤 및 전역 클래스로 긴밀히 결합되어 있어 구조 파악을 위한 학습 곡선이 필요합니다. – **기존 대형 프로젝트 연동 오버헤드**: 이미 독자적인 전역 오디오 믹서나 커스텀 화면 전환 시스템을 가지고 있는 기존 활성 프로젝트에 통합할 때, 오토로드(Autoload) 충돌이나 시그널 맵핑을 수동으로 재조정하는 과정이 꽤 까다로울 수 있습니다.
웹 프론트엔드 개발에 비유하자면, 매번 프로젝트를 만들 때마다 로그인, 회원가입, 내 정보 수정, 사이트 전역 다크모드/라이트모드, 다국어 처리, Next.js / React Router용 비동기 스켈레톤 로딩(Skeleton Loading) 페이지를 바닥부터 빌드하는 노가다를 없애주는 ‘Next.js 템플릿’ 또는 ‘Tailwind UI 프리미엄 대시보드 스타터 킷’과 같습니다. 이 플러그인은 전역 상태 관리(AppConfig = Redux/Zustand), UI 테마 및 반응형 레이아웃(= CSS Grid & Flexbox), 기기 설정 자동 로컬 저장(Persistent Config = LocalStorage API), 사운드 믹서(= Web Audio API 라이브러리)가 이미 아름답게 짜여 유기적으로 돌아가는 보일러플레이션 시스템입니다.
💡 에디터 최종 요약: Maaack’s Menus Template은 지루한 보일러플레이트성 UI 구현 작업을 완전히 스킵하고, 개발 첫날부터 오로지 ‘게임의 실제 재미 요소와 핵심 메커니즘’에만 온전하게 집중할 수 있도록 돕는 최고의 프로덕션 동반자입니다. 뛰어난 확장성과 다양한 디바이스 대응력을 가진 이 템플릿으로 시간 낭비 없이 완벽한 프리미엄 게임 UI를 완성해 보세요!
4
Menus Plugin
모든 신규 게임 프로젝트나 게임잼 참가 시 매번 반복적으로 구현해야 하는 메인 메뉴, 옵션(그래픽 설정, VFX 토글, 오디오 버스 연결, 난이도 제어 등) 및 크레딧 화면을 직접 그리드 레이아웃과 UI 스크립팅으로 짜는 소모적인 수작업을 없애줍니다. 검증된 UI 컨트롤 구조와 세팅 값들이 사전에 구성되어 있어, 개발자는 플러그인이 제공하는 커스텀 노드를 추가하고 인스펙터 값을 채운 뒤, 몇 가지 시그널을 게임 시스템에 연결하는 것만으로 완성도 높은 UI 백본을 빠르게 구축할 수 있습니다.
Godot Engine 3.x 실행 → 하단의 'AssetLib' 탭 선택 → 'Menus Plugin' 검색 → 에셋 선택 후 'Download' → 다운로드 완료 후 'Install' 클릭하여 프로젝트에 설치 → 상단 메뉴 'Project' -> 'Project Settings' -> 'Plugins' 탭으로 이동 → 'Menus Plugin' 우측의 'Enable'을 체크하여 플러그인을 활성화합니다. (설치 후 에셋 내부의 Demo 폴더를 참고하면 올바른 연결 구성을 직관적으로 파악할 수 있습니다).
빈 씬을 하나 생성한 뒤, 새 노드 추가 메뉴에서 플러그인이 제공하는 커스텀 노드인 Menus 노드를 씬 트리에 추가합니다. 앱을 실행하기 전에 반드시 인스펙터(Inspector) 창에서 필요한 스크립트 변수들(시작 게임 씬 경로, 크레딧 텍스트 등)을 올바르게 설정해야 합니다. 그 후 코드상에서 Menus 노드가 발행하는 핵심 설정 변경 시그널들을 오디오 버스나 게임 상태 전역 싱글톤(Autoload) 등과 연결하여 동작을 완성합니다.
```gdscript
# Menus 노드를 빈 씬에 생성하고, 시그널을 게임 오디오 및 세팅 시스템에 바인딩하는 예제
extends Node
onready var menus_node = $Menus
func _ready() -> void:
# Menus 노드에서 제공하는 대표적인 4가지 설정 변경 시그널을 바인딩합니다.
menus_node.connect("options_difficulty", self, "_on_difficulty_changed")
menus_node.connect("options_vfx", self, "_on_vfx_toggled")
menus_node.connect("options_music", self, "_on_music_toggled")
menus_node.connect("options_sfx", self, "_on_sfx_toggled")
func _on_difficulty_changed(difficulty_idx: int) -> void:
# 난이도 변경 처리 (0: Easy, 1: Medium, 2: Hard)
match difficulty_idx:
0: GameManager.set_difficulty("Easy")
1: GameManager.set_difficulty("Medium")
2: GameManager.set_difficulty("Hard")
func _on_vfx_toggled(vfx_on: bool) -> void:
# 그래픽 특수효과(VFX) 활성/비활성 처리
get_node("/root/WorldEnvironment").environment.glow_enabled = vfx_on
func _on_music_toggled(music_on: bool) -> void:
# 오디오 서버의 'Music' 버스 음소거 여부 설정
var bus_idx = AudioServer.get_bus_index("Music")
AudioServer.set_bus_mute(bus_idx, not music_on)
func _on_sfx_toggled(sfx_on: bool) -> void:
# 오디오 서버의 'SFX' 버스 음소거 여부 설정
var bus_idx = AudioServer.get_bus_index("SFX")
AudioServer.set_bus_mute(bus_idx, not sfx_on)
```
– **통합된 올인원 패키지**: 메인 메뉴, 옵션 세팅, 크레딧 페이지가 단일 커스텀 노드 시스템 내에 유기적으로 연결되어 있어 구조적 복잡성이 매우 적습니다. – **명확한 시그널 기반 연동**: 난이도, 오디오, VFX 토글 상태 등이 시그널을 통해 이벤트 기반으로 노출되므로, 기존 코드 아키텍처에 사이드 이펙트 없이 붙이기 편리합니다. – **게임잼/프로토타입 가속화**: 인프라 UI 구축에 걸리는 시간을 분 단위로 단축시켜 주어, 기획 검증이나 빠른 데모 제작 시 핵심 게임 루프 개발에만 주력할 수 있게 합니다.
– **Godot 3.x 환경 전용**: 플러그인이 Godot 3.4 환경을 타겟으로 작성되었기 때문에, 최신 Godot 4.x 프로젝트에서 사용하려면 Callable 전달 방식 수정 및 일부 Control 노드 속성 마이그레이션 등 추가적인 수동 포팅 작업이 필요합니다. – **제한된 완성도와 고정된 레이아웃**: 제작자가 개발을 중단한 상태라 Save/Load 시스템 메뉴가 내부에 정의만 되어 있을 뿐 미구현 상태이며, 세부적인 그래픽 테마나 다국어 번역(Localization), 추가 세팅 옵션을 유연하게 커스터마이징하려면 노드 자체를 뜯어서 코드를 개조해야 하는 한계가 있습니다.
웹 프론트엔드 개발자의 관점에서 비교하자면, 이 플러그인은 **React나 Vue 프로젝트에서 흔히 쓰이는 ‘완성형 세팅 모달 패널(Settings Modal Template) 컴포넌트’**와 정확히 똑같습니다. 메인 화면, 다크모드/라이트모드 스위치, 사운드 볼륨 제어 슬라이더, 라이선스/크레딧 정보를 담은 대화상자 레이아웃을 직접 CSS Flexbox나 Tailwind CSS로 한 땀 한 땀 마크업하고 State 관리를 짤 필요 없이, 라이브러리에서 제공하는 패키지를 가져온 뒤 `
💡 에디터 최종 요약: Godot 3 환경에서 빠르고 신뢰성 높은 UI 기초 체력을 확보하고 싶다면 BigDC의 ‘Menus Plugin’은 훌륭한 선택지입니다. 매번 골치 아프고 번거로운 볼륨 토글, 난이도 조작, 화면 모드 변경 및 제작진 크레딧 UI를 구현하는 시간은 이제 플러그인에 맡기세요. 게임플레이 본연의 재미를 설계하는 일에 소중한 에너지를 오롯이 투자해 보시기 바랍니다!

댓글 남기기