/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/LapGate.gd
95 строк
3 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
# res://scripts/LapGateNode.gd extends Node3D class_name LapGateNode @export var sensor_path: NodePath # <- укажите дочерний Area3D (прямоугольник финиша) @export var car_path: NodePath # <- укажите вашу машину (FreeCar) @export var min_lap_time_s: float = 3.0 @export var laps_total: int = 3 @export var debug_log: bool = true signal lap_started(lap_index: int) signal lap_completed(lap_index: int, lap_time_s: float) signal race_finished(total_time_s: float, laps: int) var _sensor: Area3D = null var _car: Node3D = null var _started: bool = false var _lap_start_time: float = 0.0 var _last_cross_time: float = 0.0 var _laps_done: int = 0 func _ready() -> void: if sensor_path != NodePath(""): _sensor = get_node_or_null(sensor_path) as Area3D if car_path != NodePath(""): _car = get_node_or_null(car_path) as Node3D # авто-поиск машины по группе при необходимости if _car == null: var pcs: Array = get_tree().get_nodes_in_group("player_car") if pcs.size() > 0 and pcs[0] is Node3D: _car = pcs[0] as Node3D if _sensor == null or _car == null: push_error("[LapGateNode] Укажите sensor_path (Area3D) и car_path (Node3D).") set_process(false) return _sensor.monitoring = true _sensor.monitorable = true if not _sensor.body_entered.is_connected(_on_body_entered): _sensor.body_entered.connect(_on_body_entered) _started = false _lap_start_time = 0.0 _last_cross_time = 0.0 _laps_done = 0 if debug_log: print("[LapGateNode] READY. min=", min_lap_time_s, "s total_laps=", laps_total) func _on_body_entered(body: Node) -> void: if body != _car: return var now: float = Time.get_ticks_msec() / 1000.0 # анти-дребезг if _last_cross_time > 0.0: var dt_from_last: float = now - _last_cross_time if dt_from_last < 0.2: return _last_cross_time = now # старт if not _started: _started = true _laps_done = 0 _lap_start_time = now if debug_log: print("[LapGateNode] START") emit_signal("lap_started", 1) return # завершение круга var lap_time: float = now - _lap_start_time if lap_time < min_lap_time_s: if debug_log: print("[LapGateNode] Ignored (too fast): ", lap_time) return _laps_done += 1 emit_signal("lap_completed", _laps_done, lap_time) if debug_log: print("[LapGateNode] LAP ", _laps_done, " = ", lap_time, " s") _lap_start_time = now if laps_total > 0: if _laps_done >= laps_total: if debug_log: print("[LapGateNode] FINISH | laps=", _laps_done) var total_time: float = now - (_lap_start_time - lap_time) emit_signal("race_finished", total_time, _laps_done) set_process(false)