Files
my-world/maps/sandbox/nav_bake.gd
T
aibrashandClaude Sonnet 5.5 fc0139dc05 Структура проекта: папки по назначению, карты самодостаточны, инструменты, README
- Перенос: Net→net, Player→player, World/*→maps/{hub,sandbox,backrooms}, core, objects,
  models/*→chasers/{rock,verity} и maps/*/models. Имена внутри папок с .glb не менялись
  (рядом лежат извлечённые текстуры). Все пути, пресеты экспорта и автолоады обновлены.
- Преследователи: rock-follow.gd → chasers/chaser.gd; камень в песочнице теперь инстанс
  chasers/rock/rock.tscn (как Верити).
- Удалён мусор: неиспользуемое небо sunflowers, Tree_01.glb, rock-path.gd, старая
  модель Верити, unwrap_cache (теперь в .gitignore).
- Основной пакет игры 70 КБ (камень и Верити уехали в пакеты карт).
- tools/: export_all.sh, serve_web.py (nginx-подобный dev-сервер), deploy_server.sh,
  test/ (боты, временный проект и сервер). Net: флаг --client для headless-клиента.
- deploy/: боевые nginx.conf и my-world.service, project.godot выделенного сервера.
- README переписан: что есть и чего нет, структура, карты, преследователи, сеть, пакеты,
  деплой, грабли, дорожная карта (телефон).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 17:47:47 +05:00

48 lines
2.2 KiB
GDScript

extends NavigationRegion3D
# Запекает навмеш при старте игры по статическим коллизиям уровня (пол, здания, деревья).
const SOURCE_GROUP := "nav_source"
@export var exclude: Array[NodePath] = [] # Узлы, которые не должны попасть в навмеш (например, сам камень)
@export var bake_half_size := 300.0 # Половина стороны квадрата запекания вокруг центра мира
@export var cell_size := 1.0 # Крупная ячейка — быстрое запекание (в вебе нет потоков)
@export var agent_radius := 2.0
@export var agent_height := 5.0
func _ready() -> void:
var nm := NavigationMesh.new()
nm.cell_size = cell_size
nm.cell_height = 0.25
nm.agent_radius = agent_radius
nm.agent_height = agent_height
nm.agent_max_climb = 0.5
nm.geometry_parsed_geometry_type = NavigationMesh.PARSED_GEOMETRY_STATIC_COLLIDERS
nm.geometry_source_geometry_mode = NavigationMesh.SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN
nm.geometry_source_group_name = SOURCE_GROUP
nm.filter_baking_aabb = AABB(Vector3(-bake_half_size, -10, -bake_half_size), Vector3(bake_half_size * 2, 60, bake_half_size * 2))
navigation_mesh = nm
var map := get_world_3d().navigation_map
NavigationServer3D.map_set_cell_size(map, nm.cell_size)
NavigationServer3D.map_set_cell_height(map, nm.cell_height)
# Ждём кадр, чтобы процедурные узлы (лес) успели создать коллизии
await get_tree().process_frame
var excluded: Array[Node] = []
for p in exclude:
var n := get_node_or_null(p)
if n:
excluded.append(n)
_mark_sources(get_parent(), excluded)
bake_navigation_mesh(true)
# Помечает всё дерево сцены как источник геометрии, обходя исключённые узлы
func _mark_sources(node: Node, excluded: Array[Node]) -> void:
for c in node.get_children():
if c == self or c in excluded:
continue
if excluded.any(func(e): return c.is_ancestor_of(e)):
_mark_sources(c, excluded)
else:
c.add_to_group(SOURCE_GROUP)