Commit 65e74a22 authored by Gavin An's avatar Gavin An

hud.gd -> gamemanager.gd 로 변경

parent 371ec1d7
...@@ -66,6 +66,8 @@ ...@@ -66,6 +66,8 @@
- [x] `hud.gd` 스크립트를 수정하여 기존의 중복된 유닛 ID 버그를 해결(Striker 외형으로만 고정 스폰되던 현상 픽스)하고, Guardian 유닛 소환 시 전용 `guardian_unit.tscn`이 스폰되도록 연동 완료 - [x] `hud.gd` 스크립트를 수정하여 기존의 중복된 유닛 ID 버그를 해결(Striker 외형으로만 고정 스폰되던 현상 픽스)하고, Guardian 유닛 소환 시 전용 `guardian_unit.tscn`이 스폰되도록 연동 완료
- [x] 사용자가 직접 `striker_unit.tscn`에서 모델 Y축 회전 보정(180도)을 조치한 내용을 인지하고, `base_unit.gd` 스크립트 상에서 불필요해진 수동 회전 보정 코드부를 완전히 삭제하여 씬 지향적 설정을 완수 - [x] 사용자가 직접 `striker_unit.tscn`에서 모델 Y축 회전 보정(180도)을 조치한 내용을 인지하고, `base_unit.gd` 스크립트 상에서 불필요해진 수동 회전 보정 코드부를 완전히 삭제하여 씬 지향적 설정을 완수
- [x] Striker 유닛의 뼈대 스켈레톤의 오른손 본(`RightHand`)에 `BoneAttachment3D` 노드를 런타임 동적 배치하고, `azure_blade.fbx` 검 무기를 텍스처 오버라이드 매핑(`azure_blade_0.png`)과 방향/크기 보정을 더해 안정적으로 쥐어주는 런타임 무기 장착 시스템 구현 완료 - [x] Striker 유닛의 뼈대 스켈레톤의 오른손 본(`RightHand`)에 `BoneAttachment3D` 노드를 런타임 동적 배치하고, `azure_blade.fbx` 검 무기를 텍스처 오버라이드 매핑(`azure_blade_0.png`)과 방향/크기 보정을 더해 안정적으로 쥐어주는 런타임 무기 장착 시스템 구현 완료
- [x] 데이터와 UI/제어 로직의 느슨한 결합(Loose Coupling)을 위해 데이터 매니저 싱글톤 `DataManager` (`res://src/autoload/data_manager.gd`)을 신설하고 오토로드에 등록
- [x] `hud.gd`에 하드코딩되어 있던 5종 유닛 최초 세팅 데이터와 `stage_manager.gd`에 정의되어 있던 몬스터 스폰 스펙(HP 스케일링 공식 및 골드 리워드 테이블)을 모두 `DataManager` 싱글톤으로 온전히 이전 및 리팩토링 완료
--- ---
......
...@@ -18,6 +18,7 @@ config/icon="res://icon.svg" ...@@ -18,6 +18,7 @@ config/icon="res://icon.svg"
[autoload] [autoload]
GameManager="*res://src/autoload/game_manager.gd" GameManager="*res://src/autoload/game_manager.gd"
DataManager="*res://src/autoload/data_manager.gd"
[physics] [physics]
......
extends Node
## 게임 내 유닛 및 몬스터 스펙 데이터를 총괄하는 데이터 매니저 싱글톤
# 유닛 리소스 템플릿 목록
var unit_templates: Array[UnitData] = []
func _ready() -> void:
_initialize_unit_templates()
## 5종의 유닛 능력치 데이터 초기 셋업
func _initialize_unit_templates() -> void:
# 1. Striker (연사형 근접 유닛)
var striker: UnitData = UnitData.new()
striker.unit_id = "Unit_Striker"
striker.unit_name = "Striker"
striker.damage = 12.0
striker.cooldown = 0.5
striker.move_speed = 6.0
striker.attack_range = 1.5
striker.is_ranged = false
striker.unit_color = Color(0.12, 0.45, 0.85, 1.0) # 청색
unit_templates.append(striker)
# 2. Guardian (밸런스형 근접 유닛)
var guardian: UnitData = UnitData.new()
guardian.unit_id = "Unit_Guardian"
guardian.unit_name = "Guardian"
guardian.damage = 25.0
guardian.cooldown = 1.0
guardian.move_speed = 4.0
guardian.attack_range = 1.5
guardian.is_ranged = false
guardian.unit_color = Color(0.85, 0.65, 0.12, 1.0) # 황금색
unit_templates.append(guardian)
# 3. Ranger (원거리 유닛)
var ranger: UnitData = UnitData.new()
ranger.unit_id = "Unit_Ranger"
ranger.unit_name = "Ranger"
ranger.damage = 18.0
ranger.cooldown = 0.8
ranger.move_speed = 4.5
ranger.attack_range = 10.0
ranger.is_ranged = true
ranger.unit_color = Color(0.12, 0.75, 0.25, 1.0) # 녹색
unit_templates.append(ranger)
# 4. Slayer (고화력 대형 유닛)
var slayer: UnitData = UnitData.new()
slayer.unit_id = "Unit_Slayer"
slayer.unit_name = "Slayer"
slayer.damage = 55.0
slayer.cooldown = 1.8
slayer.move_speed = 3.5
slayer.attack_range = 1.6
slayer.is_ranged = false
slayer.unit_color = Color(0.85, 0.12, 0.12, 1.0) # 진적색
unit_templates.append(slayer)
# 5. Archmage (극단적 극딜 마법 유닛)
var archmage: UnitData = UnitData.new()
archmage.unit_id = "Unit_Archmage"
archmage.unit_name = "Archmage"
archmage.damage = 110.0
archmage.cooldown = 3.0
archmage.move_speed = 3.0
archmage.attack_range = 12.0
archmage.is_ranged = true
archmage.unit_color = Color(0.55, 0.12, 0.85, 1.0) # 보라색
unit_templates.append(archmage)
## 특정 스테이지에 따른 몬스터 체력(HP) 반환
func get_monster_hp(stage: int) -> float:
return 100.0 + (stage - 1) * 50.0
## 특정 스테이지에 따른 몬스터 처치 보상 골드 반환
func get_monster_gold_reward(stage: int) -> int:
if stage >= 20: return 100
elif stage >= 15: return 60 + (stage - 15) * 8
elif stage >= 10: return 40 + (stage - 10) * 4
elif stage >= 5: return 25 + (stage - 5) * 3
elif stage >= 2: return 18 + (stage - 2) * 2
else: return 15
...@@ -86,8 +86,8 @@ func _on_spawn_timer_timeout() -> void: ...@@ -86,8 +86,8 @@ func _on_spawn_timer_timeout() -> void:
# 몬스터 초기화 (HP, 보상 골드 설정) # 몬스터 초기화 (HP, 보상 골드 설정)
var stage: int = GameManager.current_stage var stage: int = GameManager.current_stage
var monster_hp: float = 100.0 + (stage - 1) * 50.0 var monster_hp: float = DataManager.get_monster_hp(stage)
var monster_gold: int = _get_monster_gold_reward(stage) var monster_gold: int = DataManager.get_monster_gold_reward(stage)
if monster_instance.has_method("initialize_monster"): if monster_instance.has_method("initialize_monster"):
monster_instance.call("initialize_monster", monster_hp, monster_gold) monster_instance.call("initialize_monster", monster_hp, monster_gold)
...@@ -118,12 +118,3 @@ func _on_active_monster_count_changed(count: int) -> void: ...@@ -118,12 +118,3 @@ func _on_active_monster_count_changed(count: int) -> void:
# 다음 스테이지로 상태 전이 # 다음 스테이지로 상태 전이
GameManager.current_stage += 1 GameManager.current_stage += 1
_start_next_stage_cooldown(5.0) _start_next_stage_cooldown(5.0)
## 스테이지별 몬스터 처치 보상 골드 테이블 (game_design.md 참고)
func _get_monster_gold_reward(stage: int) -> int:
if stage >= 20: return 100
elif stage >= 15: return 60 + (stage - 15) * 8
elif stage >= 10: return 40 + (stage - 10) * 4
elif stage >= 5: return 25 + (stage - 5) * 3
elif stage >= 2: return 18 + (stage - 2) * 2
else: return 15
...@@ -15,12 +15,9 @@ extends Control ...@@ -15,12 +15,9 @@ extends Control
@onready var result_title: Label = $ResultPopup/ResultTitle @onready var result_title: Label = $ResultPopup/ResultTitle
@onready var restart_button: Button = $ResultPopup/RestartButton @onready var restart_button: Button = $ResultPopup/RestartButton
# 5가지 유닛 능력치 리소스 템플릿 배열
var _unit_templates: Array[UnitData] = []
func _ready() -> void: func _ready() -> void:
# 5종 유닛 리소스 템플릿 빌드
_initialize_unit_templates()
# GameManager 시그널 핸들러 등록 # GameManager 시그널 핸들러 등록
GameManager.gold_changed.connect(_on_gold_changed) GameManager.gold_changed.connect(_on_gold_changed)
...@@ -39,68 +36,6 @@ func _ready() -> void: ...@@ -39,68 +36,6 @@ func _ready() -> void:
_on_stage_changed(GameManager.current_stage) _on_stage_changed(GameManager.current_stage)
_on_monster_changed(GameManager.active_monster_count) _on_monster_changed(GameManager.active_monster_count)
## 5종의 유닛 능력치 데이터 초기 셋업
func _initialize_unit_templates() -> void:
# 1. Striker (연사형 근접 유닛)
var striker: UnitData = UnitData.new()
striker.unit_id = "Unit_Striker"
striker.unit_name = "Striker"
striker.damage = 12.0
striker.cooldown = 0.5
striker.move_speed = 10.0
striker.attack_range = 1.5
striker.is_ranged = false
striker.unit_color = Color(0.12, 0.45, 0.85, 1.0) # 청색
_unit_templates.append(striker)
# 2. Guardian (밸런스형 근접 유닛)
#var guardian: UnitData = UnitData.new()
#guardian.unit_id = "Unit_Guardian"
#guardian.unit_name = "Guardian"
#guardian.damage = 25.0
#guardian.cooldown = 1.0
#guardian.move_speed = 4.0
#guardian.attack_range = 1.5
#guardian.is_ranged = false
#guardian.unit_color = Color(0.85, 0.65, 0.12, 1.0) # 황금색
#_unit_templates.append(guardian)
# 3. Ranger (원거리 유닛)
#var ranger: UnitData = UnitData.new()
#ranger.unit_id = "Unit_Ranger"
#ranger.unit_name = "Ranger"
#ranger.damage = 18.0
#ranger.cooldown = 0.8
#ranger.move_speed = 4.5
#ranger.attack_range = 10.0
#ranger.is_ranged = true
#ranger.unit_color = Color(0.12, 0.75, 0.25, 1.0) # 녹색
#_unit_templates.append(ranger)
#
## 4. Slayer (고화력 대형 유닛)
#var slayer: UnitData = UnitData.new()
#slayer.unit_id = "Unit_Slayer"
#slayer.unit_name = "Slayer"
#slayer.damage = 55.0
#slayer.cooldown = 1.8
#slayer.move_speed = 3.5
#slayer.attack_range = 1.6
#slayer.is_ranged = false
#slayer.unit_color = Color(0.85, 0.12, 0.12, 1.0) # 진적색
#_unit_templates.append(slayer)
#
## 5. Archmage (극단적 극딜 마법 유닛)
#var archmage: UnitData = UnitData.new()
#archmage.unit_id = "Unit_Archmage"
#archmage.unit_name = "Archmage"
#archmage.damage = 110.0
#archmage.cooldown = 3.0
#archmage.move_speed = 3.0
#archmage.attack_range = 12.0
#archmage.is_ranged = true
#archmage.unit_color = Color(0.55, 0.12, 0.85, 1.0) # 보라색
#_unit_templates.append(archmage)
# 골드 UI 갱신 및 소환 한도 검증 # 골드 UI 갱신 및 소환 한도 검증
func _on_gold_changed(gold: int) -> void: func _on_gold_changed(gold: int) -> void:
gold_label.text = "GOLD: " + str(gold) + " G" gold_label.text = "GOLD: " + str(gold) + " G"
...@@ -133,8 +68,8 @@ func _on_spawn_pressed() -> void: ...@@ -133,8 +68,8 @@ func _on_spawn_pressed() -> void:
# 골드 비용 소모 시도 # 골드 비용 소모 시도
if GameManager.spend_gold(GameManager.unit_spawn_cost): if GameManager.spend_gold(GameManager.unit_spawn_cost):
# 20% 동일 확률로 5종 유닛 중 무작위 1개 선정 # 20% 동일 확률로 5종 유닛 중 무작위 1개 선정
var random_index: int = randi() % _unit_templates.size() var random_index: int = randi() % DataManager.unit_templates.size()
var chosen_template: UnitData = _unit_templates[random_index] var chosen_template: UnitData = DataManager.unit_templates[random_index]
# 유닛 객체 스폰 (Striker 및 Guardian 전용 씬 분기 분할) # 유닛 객체 스폰 (Striker 및 Guardian 전용 씬 분기 분할)
var target_scene: PackedScene = base_unit_scene var target_scene: PackedScene = base_unit_scene
......
...@@ -54,3 +54,5 @@ ...@@ -54,3 +54,5 @@
- [x] `hud.gd`에 중복되어 존재하던 유닛 ID 버그를 일괄 픽스하고, 가디언 유닛 소환 시 `guardian_unit.tscn`이 씬 분기로 올바르게 로드되도록 연동 완료 - [x] `hud.gd`에 중복되어 존재하던 유닛 ID 버그를 일괄 픽스하고, 가디언 유닛 소환 시 `guardian_unit.tscn`이 씬 분기로 올바르게 로드되도록 연동 완료
- [x] 사용자가 직접 `striker_unit.tscn`에서 모델 회전 보정을 적용한 상태를 인지하고, 스크립트(`base_unit.gd`)의 수동 Y축 회전 코드를 완벽히 제거 - [x] 사용자가 직접 `striker_unit.tscn`에서 모델 회전 보정을 적용한 상태를 인지하고, 스크립트(`base_unit.gd`)의 수동 Y축 회전 코드를 완벽히 제거
- [x] Striker 유닛 오른손 본(`RightHand`)에 `BoneAttachment3D` 노드를 런타임 동적 배치하고 `azure_blade.fbx` 검 무기를 장착 및 텍스처를 씌우는 기능 구현 완료 - [x] Striker 유닛 오른손 본(`RightHand`)에 `BoneAttachment3D` 노드를 런타임 동적 배치하고 `azure_blade.fbx` 검 무기를 장착 및 텍스처를 씌우는 기능 구현 완료
- [x] `DataManager` 싱글톤 신설 및 오토로드 등록을 완료하여 유닛 데이터(5종 스펙)와 몬스터 데이터(HP 스케일링, 보상 테이블)를 통합 분리
- [x] `hud.gd``stage_manager.gd`에서 하드코딩되었던 데이터 조작 로직들을 걷어내고 `DataManager`를 참조하도록 리팩토링 완수
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment