Godot 4.6.1 기반 Body Hero 복싱 게임에서 GDScript, 씬, UDP 연동을 수정하거나 확장할 때 프로젝트 구조와 ML 파이프라인을 안전하게 유지하도록 돕는 스킬. Godot 4.6, GDScript, main.tscn, GameState, UDP 웹캠/ML 연동 작업이 언급될 때 사용한다.
이 스킬은 Body Hero 프로젝트에서 Godot 4.6.1과 GDScript를 다룰 때,
하도록 돕는다.
사용자는 보통 다음과 같은 작업을 요청한다:
이 스킬은 이런 작업을 할 때 프로젝트에 이미 있는 패턴을 재사용하도록 유도해야 한다.
이 스킬은 다음과 같은 키워드/상황이 나오면 적극적으로 적용한다:
scripts/main.gd, scripts/player.gd, scripts/enemy.gd, scripts/game_state.gd, scenes/main.tscn다른 일반 Godot 질문(예: 전혀 다른 프로젝트의 UI 튜토리얼)은 이 스킬이 아닌, 기본 Godot 4.6 문서와 일반 지식으로 처리한다.
scenes/main.tscnscripts/main.gd — UDP 수신 + 글러브 위치 보정scripts/player.gd — 펀치/가드/회피 Tween + 키보드 폴백scripts/enemy.gd — 히트 판정, HP, 피격 연출scripts/game_state.gd — 전역 HP/스태미너 상태 (AutoLoad GameState)tools/*.py, tools/README_ML.md, README.mdvar stamina: float = 100.0func _process(delta: float) -> void:GameState 싱글톤 (scripts/game_state.gd)scripts/player.gdscripts/enemy.gdscripts/main.gd 및 tools/*.py새 기능을 구현할 때는 기존 역할에 맞는 파일에 코드를 추가하는 방식을 우선으로 한다.
이 프로젝트에는 .cursor/rules/ 아래에 여러 규칙 파일이 있다:
core.mdc — 항상 적용되는 GDScript/Godot 핵심 규칙 (타입 힌트, GameState 기본 원칙 등)structure.mdc — 씬/스크립트/도구 구조와 역할input-udp.mdc — InputMap, UDP 포맷, 액션 문자열/play_action 패턴animation-hit.mdc — Tween, _busy, 히트박스 on/off 패턴gamestate.mdc — GameState 전역 상태 관리 상세 규칙ml-python.mdc — ML/UDP Python 도구와 Godot 연동 규칙이 스킬은 위 규칙들을 요약 + 작업 흐름 중심으로 묶은 상위 가이드이며, 규칙과 충돌하는 내용을 새로 만들지 않는다.
scripts/game_state.gd는 AutoLoad 싱글톤으로 등록되어 있으며, HP/스태미너 등 전역 수치를 담당한다.
스태미너 소모:
GameState.consume_stamina(GameState.STAMINA_JAB)GameState.consume_stamina(GameState.STAMINA_HOOK)비율 계산:
GameState.get_stamina_ratio()GameState.get_player_hp_ratio()
규칙:HP/스태미너/피로도와 비슷한 개념을 추가할 때는, 가능하면 GameState에 새 필드를 추가하고 이를 통해 관리한다.
씬/노드 안에 전역과 중복되는 상태 변수를 새로 만들지 않는다.
AutoLoad로 등록된 이름(GameState)을 그대로 사용한다.
scripts/player.gd는 Tween으로 펀치/가드/회피를 연출하고, 액션 이름을 기반으로 동작을 실행한다.
play_action(action: String) -> void_process에서 Input.is_action_just_pressed로 테스트"jab_l", "jab_r""upper_l", "upper_r""hook_l", "hook_r""guard", "guard_end""dodge_l", "dodge_r"패턴:
GameState.consume_stamina(...)로 스태미너를 먼저 확인한다._busy 플래그로 애니메이션 중 중복 입력을 막는다._play_jab, _play_uppercut, _play_hook, _play_guard_enter, _play_guard_exit, _play_dodge_set_glove_hit(glove, true/false)에서 collision_layer를 토글한다.이 스킬이 할 일:
_play_* 함수 패턴을 재사용하고, _busy, _guarding 등 상태 플래그를 일관되게 활용한다.README 기준 기본 키보드는 다음과 같다:
punch_left — 기본 예시: Apunch_right — 기본 예시: Dupper_left, upper_right, guard, 회피 등)은 필요에 따라 InputMap에서 추가 가능.코드를 수정하거나 예시를 제시할 때:
프로젝트 → 프로젝트 설정(Project Settings) → Input Mapscripts/player.gd의 _process 안 패턴을 참고한다.이 프로젝트는 Python 스크립트(tools/udp_send_webcam.py, udp_send_webcam_ml.py, udp_send_mouse.py 등)를 통해 UDP로 데이터를 보내고, Godot에서 이를 받아 동작한다.
"left_x,left_y,right_x,right_y" 형식 문자열"jab_l", "jab_r", "upper_l", "upper_r", "hook_l", "hook_r", "guard", "guard_end"이 스킬은 GDScript 측에서 포맷을 바꾸지 않도록 해야 한다.
play_action(...) 호출 또는 글러브 좌표 업데이트를 한다.tools/README_ML.md, pose_server.py, udp_send_webcam_ml.py 등)을 수정하는 방향을 안내한다.자세한 내용은 tools/README_ML.md를 따르면 되고, 이 스킬은 Godot 코드에 영향을 주는 부분만 요약한다.
collect_pose_data.pytrain_pose_classifier.py → pose_classifier.keraspose_server.py (Flask, /predict)udp_send_webcam_ml.py가 액션 문자열을 UDP로 전송Godot 입장에서는:
GameState에 필요하면 새 스태미너 상수 추가 (STAMINA_*).player.gd의 play_action에 새 액션 분기 추가._play_* 계열 함수 패턴을 복사해 새 동작용 트윈/히트박스 로직을 구현.tools/*.py에 반영하도록 안내.scripts/game_state.gd에서 관련 상수/최대치만 조정한다.get_stamina_ratio, get_player_hp_ratio)를 활용한다.GameState에서 읽는다.tools/udp_send_mouse.py 또는 udp_send_webcam.py, udp_send_webcam_ml.py 실행.scripts/main.gd의 수신 부분에서 로그를 찍어 디버깅(예: print(udp_string)).GameState와 기존 player.gd 패턴을 재사용.play_action을 호출하는 방향으로 설계.tools/README_ML.md의 워크플로를 요약 설명.requirements_ml.txt 설치 여부를 체크리스트처럼 안내.이 스킬을 사용할 때는 항상 프로젝트에 이미 존재하는 패턴을 우선 관찰하고, 거기에 자연스럽게 이어 붙이는 형태로 코드를 제안한다.