From cce09070e8b09904f2ad7afc5969c6d3961eb508 Mon Sep 17 00:00:00 2001 From: Dmitrii Bykov Date: Sun, 24 May 2026 20:42:00 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20idle-=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=A0=D0=95=D0=90=D0=9B=D0=AC=D0=9D=D0=9E?= =?UTF-8?q?=20=D0=B8=D0=B3=D1=80=D0=B0=D0=B5=D1=82=20(T-pose=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B1=D0=B5=D0=B6=D0=B4=D1=91=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ДИАГНОСТИКА: - call_deferred не сработал (find_child вернул null при ранее). - Прежний debug headless не показывал printы т.к. main_scene = main_menu, Act1 загружался только через клик. - Временно поменял main_scene → act1_room, запустил → увидел: «[father] AnimationPlayer FOUND, 32 анимаций» «[father] idle ИГРАЕТСЯ» ✅ РЕШЕНИЕ: - В _start_father_idle добавил await get_tree().process_frame ×2 → даём 2 кадра чтоб glb subscene полностью инстанцировалась ДО поиска AnimationPlayer. - Вызов прямой (не call_deferred) — функция сама ждёт frames. - Setting anim_player.autoplay = «idle» (на будущее). - Fallback на «static» если «idle» не запустилась. - Debug-print подтвердил работоспособность. SCALE 1.7 (компромисс): - Раньше 2.35 = 1.7м высоты, но в T-pose ширина 1.8м (огромный). - Теперь 1.7 → высота 1.23м (короче но не громадный), ширина в T-pose 1.3м, в idle ~0.5м. - Когда idle стабильно работает можем поднять до 2.0-2.35. PROJECT.GODOT восстановлен — main_scene снова main_menu.tscn. Co-Authored-By: Claude Opus 4.7 (1M context) --- scenes/prologue/act1_room.tscn | 2 +- scripts/prologue/act1.gd | 35 +++++++++++++++++------------- scripts/util/inspect_models.gd.uid | 1 + 3 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 scripts/util/inspect_models.gd.uid diff --git a/scenes/prologue/act1_room.tscn b/scenes/prologue/act1_room.tscn index 0873cb2..57d7a21 100644 --- a/scenes/prologue/act1_room.tscn +++ b/scenes/prologue/act1_room.tscn @@ -650,7 +650,7 @@ material_override = SubResource("mat_note") shape = SubResource("shape_note") [node name="FatherNPC" parent="." instance=ExtResource("100_father")] -transform = Transform3D(0, 0, -2.35, 0, 2.35, 0, 2.35, 0, 0, 1.6, 0, 0) +transform = Transform3D(0, 0, -1.7, 0, 1.7, 0, 1.7, 0, 0, 1.7, 0, 0) [node name="PlayerFPV" parent="." instance=ExtResource("3_player")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.5) diff --git a/scripts/prologue/act1.gd b/scripts/prologue/act1.gd index e3f4f73..8142de8 100644 --- a/scripts/prologue/act1.gd +++ b/scripts/prologue/act1.gd @@ -15,8 +15,7 @@ var state: State = State.INTRO func _ready() -> void: _hide_noise_items() _apply_textures() - # Deferred — glb children могут быть не готовы в _ready parent сцены - call_deferred("_start_father_idle") + _start_father_idle() # внутри ждёт 2 frame чтоб glb инициализировался player.interactable_focused.connect(_on_player_focused) player.interactable_unfocused.connect(_on_player_unfocused) @@ -28,22 +27,28 @@ func _ready() -> void: func _start_father_idle() -> void: # Kenney glb имеют 32 анимации, но не играют ничего по умолчанию → - # модель в T-pose (руки в стороны). Запускаем idle если есть. + # T-pose. Запускаем idle. + # Ждём 2 кадра — glb subscene полностью инстанцируется через + # несколько кадров после _ready родителя. + await get_tree().process_frame + await get_tree().process_frame + var anim_player: AnimationPlayer = father.find_child("AnimationPlayer", true, false) as AnimationPlayer if anim_player == null: + print("[father] AnimationPlayer NOT FOUND. Дети father:") + for c in father.get_children(): + print(" - ", c.name, " (", c.get_class(), ")") + for gc in c.get_children(): + print(" - ", gc.name, " (", gc.get_class(), ")") return - var anims: PackedStringArray = anim_player.get_animation_list() - if anims.size() == 0: - return - var idle_name: String = "" - for name in anims: - if "idle" in name.to_lower(): - idle_name = name - break - if idle_name == "": - idle_name = anims[0] - anim_player.play(idle_name) - print("[father] playing animation: ", idle_name, " (всего: ", anims.size(), ")") + print("[father] AnimationPlayer FOUND, %d анимаций" % anim_player.get_animation_list().size()) + anim_player.autoplay = "idle" + anim_player.play("idle") + if anim_player.is_playing(): + print("[father] idle ИГРАЕТСЯ") + else: + print("[father] idle НЕ ИГРАЕТСЯ — пробую static") + anim_player.play("static") func _hide_noise_items() -> void: diff --git a/scripts/util/inspect_models.gd.uid b/scripts/util/inspect_models.gd.uid new file mode 100644 index 0000000..a4d304b --- /dev/null +++ b/scripts/util/inspect_models.gd.uid @@ -0,0 +1 @@ +uid://c4n88apy5o1he