/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/Game.gd
99 строк
3 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
extends Node @export var telemetry_script_path: String = "res://scripts/TelemetryScreen.gd" var telemetry_instance: Control = null var overlay: CanvasLayer = null func _enter_tree() -> void: # Добавляем action только для клавиши T (переключение телеметрии) if not InputMap.has_action("toggle_telemetry"): InputMap.add_action("toggle_telemetry") var ev_t: InputEventKey = InputEventKey.new() ev_t.physical_keycode = KEY_T InputMap.action_add_event("toggle_telemetry", ev_t) func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("toggle_telemetry"): if telemetry_instance != null and is_instance_valid(telemetry_instance): _close_telemetry() else: _open_telemetry() func _ensure_overlay() -> CanvasLayer: # UI-слой поверх 3D if overlay != null and is_instance_valid(overlay): return overlay var root: Window = get_tree().get_root() overlay = CanvasLayer.new() overlay.name = "UIOverlay" overlay.layer = 100 root.add_child(overlay) return overlay func _open_telemetry() -> void: if telemetry_instance != null and is_instance_valid(telemetry_instance): return # Защита от пустого/битого пути вида "res://" if telemetry_script_path == "" or telemetry_script_path == "res://": push_error("[Game] Telemetry path is empty or 'res://'. Set a valid .gd file.") return if not ResourceLoader.exists(telemetry_script_path): push_error("[Game] Telemetry script not found: " + telemetry_script_path) return var res: Resource = ResourceLoader.load(telemetry_script_path) if res == null: push_error("[Game] Failed to load: " + telemetry_script_path) return # В Godot 4 скрипт — это тип Script, а не GDScript var scr: Script = res as Script if scr == null: push_error("[Game] Resource is not a Script: " + telemetry_script_path) return var obj: Object = scr.new() var ui: Control = obj as Control if ui == null: push_error("[Game] Telemetry script must extend Control.") return telemetry_instance = ui telemetry_instance.name = "TelemetryScreen" telemetry_instance.set_anchors_preset(Control.PRESET_FULL_RECT) telemetry_instance.visible = true var ol: CanvasLayer = _ensure_overlay() ol.add_child(telemetry_instance) print("[Game] Telemetry opened") func _close_telemetry() -> void: if telemetry_instance != null and is_instance_valid(telemetry_instance): telemetry_instance.queue_free() telemetry_instance = null print("[Game] Telemetry closed") # Опциональный сервисный проход по сцене для очистки битых visibility_parent func _clear_bad_visibility_parents() -> void: var stack: Array[Node] = [get_tree().get_root()] while stack.size() > 0: var n: Node = stack.pop_back() for c in n.get_children(): stack.push_back(c) if n is VisualInstance3D: var vi: VisualInstance3D = n as VisualInstance3D var vp: NodePath = vi.visibility_parent if vp != NodePath(""): var p: Node = vi.get_node_or_null(vp) var bad: bool = false if p == null: bad = true # несуществующий узел elif p == vi: bad = true # указывает на себя elif vi.is_ancestor_of(p): bad = true # указывает на своего потомка → цикл if bad: push_warning("[Fix] Clear visibility_parent on %s" % [vi.get_path()]) vi.visibility_parent = NodePath("")