/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/DRSzone.gd
71 строка
2 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
extends Area3D class_name DRSzone @export var only_player: bool = true @export var show_debug_mesh: bool = true @export var debug_mesh_color: Color = Color(0.2, 1.0, 0.2, 0.35) var car: Node = null var _shape_ref: BoxShape3D = null var _dbg_mesh: MeshInstance3D = null func _ready() -> void: # Area3D должен уметь посылать события monitoring = true monitorable = true # Реальная геометрия зоны — дочерний CollisionShape3D с BoxShape3D var cs := get_node_or_null("CollisionShape3D") as CollisionShape3D if cs != null and cs.shape is BoxShape3D: _shape_ref = cs.shape as BoxShape3D # Дебаг-куб, чтобы видеть зону глазом if show_debug_mesh and cs != null and _shape_ref != null: var m := BoxMesh.new() m.size = _shape_ref.size var mi := MeshInstance3D.new() mi.mesh = m var mat := StandardMaterial3D.new() mat.albedo_color = debug_mesh_color mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA mi.material_override = mat # Совмещаем визуализацию с реальным CollisionShape mi.transform = cs.transform add_child(mi) _dbg_mesh = mi # События входа/выхода body_entered.connect(_on_enter) body_exited.connect(_on_exit) # Найдём машину игрока (если нужно ограничивать) car = _find_player_car() func _on_enter(body: Node) -> void: if not _accept(body): return _notify_car(body, true) func _on_exit(body: Node) -> void: if not _accept(body): return _notify_car(body, false) func _notify_car(body: Node, allowed: bool) -> void: # Машина должна иметь метод drs_set_allowed(bool) if body.has_method("drs_set_allowed"): body.call("drs_set_allowed", allowed) func _accept(body: Node) -> bool: if only_player: if car == null: return false return body == car return true func _find_player_car() -> Node: var players: Array = get_tree().get_nodes_in_group("player_car") if players.size() > 0: return players[0] as Node return null