extends CanvasLayer @onready var health_text = $HealthText @onready var vignette = $Vignette var health_component: Node = null func _ready() -> void: # Ищем HealthComponent у нашего игрока (родителя) if get_parent(): health_component = get_parent().find_child("HealthComponent", true, false) if health_component == null: print("[UI ЗДОРОВЬЯ] КРИТИЧЕСКАЯ ОШИБКА: HealthComponent игрока не найден!") # Изначально принудительно настраиваем видимость if health_text: health_text.visible = true if vignette: vignette.visible = false func _process(delta: float) -> void: if health_component == null: return var current_health = health_component.current_health # 1. ОБНОВЛЯЕМ ЦИФРЫ НА ЭКРАНЕ if health_text: health_text.text = str(clamp(int(current_health), 0, 100)) # Красим цифры при низком здоровье if current_health <= 30: health_text.add_theme_color_override("font_color", Color.RED) else: health_text.add_theme_color_override("font_color", Color.WHITE) # 2. УПРАВЛЯЕМ КРАСНОЙ ВИНЬЕТКОЙ if vignette: if current_health <= 30 and current_health > 0: vignette.visible = true # Эффект плавного биения сердца (пульсация) var color_rect = vignette.get_node_or_null("ColorRect") if color_rect: color_rect.visible = true var pulse = (sin(Time.get_ticks_msec() * 0.005) + 1.0) / 2.0 color_rect.modulate.a = lerp(0.3, 1.0, pulse) else: vignette.visible = false # 3. АВТОРЕСТАРТ ПРИ СМЕРТИ (Перезагрузка уровня) if current_health <= 0: print("[UI ЗДОРОВЬЯ] Игрок погиб! Перезагружаю уровень через 2 секунды...") # Отключаем процесс, чтобы не спамить перезагрузкой set_process(false) # Ждем 2 секунды, чтобы игрок успел понять, что умер await get_tree().create_timer(2.0).timeout # Мягко перезапускаем текущую сцену get_tree().reload_current_scene()