/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/CollisionStopper.gd
74 строки
2 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
# res://scripts/CollisionStopper.gd extends Node class_name CollisionStopper @export var stop_seconds: float = 2.0 # сколько держать остановку после удара @export var debug_prints: bool = false var car: CharacterBody3D = null var stun_timer: float = 0.0 func _ready() -> void: # Ищем родителя-машину var p: Node = get_parent() if p is CharacterBody3D: car = p as CharacterBody3D else: push_error("[CollisionStopper] Родитель не CharacterBody3D") set_physics_process(false) func _physics_process(delta: float) -> void: if car == null: return # Если оглушены — держим машину на месте if stun_timer > 0.0: stun_timer -= delta if stun_timer < 0.0: stun_timer = 0.0 car.velocity = Vector3.ZERO return # После шага физики у CharacterBody3D есть данные столкновений var n: int = car.get_slide_collision_count() if n <= 0: return for i in range(n): var col: KinematicCollision3D = car.get_slide_collision(i) if col == null: continue var other: Object = col.get_collider() if other == null: continue # интересуют другие машины if other is CharacterBody3D: # Остановить себя _apply_stun(stop_seconds) # Попробовать остановить вторую машину, если у неё тоже есть этот модуль var other_node: CharacterBody3D = other as CharacterBody3D var stopper: CollisionStopper = _find_stopper(other_node) if stopper != null: stopper._apply_stun(stop_seconds) if debug_prints: print("[CollisionStopper] ", car.name, " <-> ", other_node.name, " STOP ", stop_seconds, "s") break # одной коллизии достаточно func _apply_stun(seconds: float) -> void: var t: float = seconds if t < 0.0: t = 0.0 # Берём максимум, чтобы повторные касания не сокращали текущий таймер if stun_timer < t: stun_timer = t # Немедленно сбросим скорость if car != null: car.velocity = Vector3.ZERO func _find_stopper(body: CharacterBody3D) -> CollisionStopper: var kids: Array = body.get_children() for k in kids: var n: Node = k if n is CollisionStopper: return n as CollisionStopper return null