From e05cf8717381d5047e90b7b583ecc427c51870ce Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 6 Nov 2026 16:20:57 +0100 Subject: [PATCH] =?UTF-8?q?3D:=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20=D0=B7=D0=BE=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC=D0=B5=D1=80=D0=B0=20=D0=BF=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BA=D1=80=D0=B0=D0=B9=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B7=D0=BE=D0=BD=D1=8B=20(=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D1=8F=20=D0=B7=D0=BE=D0=BD=D0=B0=20+=202=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B5=D1=82=D0=BA=D0=B8),=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B2=D1=81=D1=8E=20--=20=D0=BD=D0=B5=20=D1=83=D0=BB=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=20=D0=B4=D0=B0=D0=BB=D0=B5=D0=BA=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- Assets/Scripts/City3D/City3DCamera.cs | 4 +++- Assets/Scripts/City3D/City3DController.cs | 10 +++++++--- Docs/Modules/Settlement.md | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/City3D/City3DCamera.cs b/Assets/Scripts/City3D/City3DCamera.cs index fa56c53..5fc80c4 100644 --- a/Assets/Scripts/City3D/City3DCamera.cs +++ b/Assets/Scripts/City3D/City3DCamera.cs @@ -87,11 +87,13 @@ public class City3DCamera : MonoBehaviour } } - public void FocusOn(Rect area) + // onlyZoomOut -- не приближать: если камера уже дальше, расстояние остаётся (открытие зоны, 06.11) + public void FocusOn(Rect area, bool onlyZoomOut = false) { focusTarget = new Vector3(area.center.x, 0, area.center.y); // отойти так, чтобы область поместилась между HUD сверху и снизу focusDistance = Mathf.Clamp(FitDistance(area), minDistance, MaxDistanceNow); + if (onlyZoomOut) focusDistance = Mathf.Max(focusDistance, Mathf.Min(distance, MaxDistanceNow)); focusing = true; zoomTo = -1f; } diff --git a/Assets/Scripts/City3D/City3DController.cs b/Assets/Scripts/City3D/City3DController.cs index c95ad13..75ec8b1 100644 --- a/Assets/Scripts/City3D/City3DController.cs +++ b/Assets/Scripts/City3D/City3DController.cs @@ -982,14 +982,18 @@ public class City3DController : MonoBehaviour, City3DSave.ILive if (ghost != null) UpdateGhost(); if (townHallLevel > before) { - // Открылась зона -- камера плавно отходит и показывает её; здания остаются на местах - int half = City3DLayout.ZoneHalfSize(townHallLevel), c = City3DLayout.Size / 2; - cameraRig.FocusOn(new Rect(c - half, c - half, half * 2, half * 2)); + // Открылась зона -- камера плавно отходит и показывает её КРАЙ: старая зона и ZoneEdgeCells клеток новой за её + // границей (06.11, Саша: вся зона целиком -- камера улетала слишком далеко). Ближе, чем была, не подъезжает + int c = City3DLayout.Size / 2; + int show = Mathf.Min(City3DLayout.ZoneHalfSize(townHallLevel), City3DLayout.ZoneHalfSize(before) + ZoneEdgeCells); + cameraRig.FocusOn(new Rect(c - show, c - show, show * 2, show * 2), onlyZoomOut: true); Say($"Ратуша {townHallLevel} ур.: открыта новая зона"); if (stateApplied && pendingFrom2D.Count > 0) PlacePendingFrom2D(); // здания из 2D, которые ждали места } } + const int ZoneEdgeCells = 2; // сколько клеток новой зоны показать при её открытии + // Камера: центр кадра -- только над открытой зоной, при самом дальнем отдалении видна вся зона (06.11) void UpdateCameraArea() { diff --git a/Docs/Modules/Settlement.md b/Docs/Modules/Settlement.md index a0d0d95..0981039 100644 --- a/Docs/Modules/Settlement.md +++ b/Docs/Modules/Settlement.md @@ -119,6 +119,7 @@ | Дата | Кто | Что | | --- | --- | --- | +| 06.11.2026 | Claude (Саша) | Открытие зоны Ратушей: камера показывает только край новой зоны — старую зону и 2 клетки новой за её границей (`ZoneEdgeCells`), а не всю зону; ближе, чем была, не подъезжает (`City3DCamera.FocusOn(..., onlyZoomOut)`). Раньше при ускорении улучшения Ратуши камера улетала слишком далеко. | | 06.11.2026 | Claude (Валдемар) | Этап 1 перехода на 3D (2D-город больше не развиваем). Сверка: все 12 зданий 2D (8 `Data_*.asset` + Склад, Амбар, Госпиталь, Терем) есть в 3D с теми же ценами и уровнем Ратуши; ни одна кнопка не ведёт в MVP1. Камера (`City3DCamera`): центр кадра не уходит за открытые зоны; при самом дальнем отдалении открытая зона видна целиком между HUD сверху и снизу — дальше всего = max(подобранное в DEV, сколько нужно для зоны), считается по проекции камеры (`FitDistance`); «+ / −» и колесо приближают плавно; перетаскивание считается на высоте земли под пальцем (на холмах карта идёт точно за пальцем); подъезд к призраку — `MoveTo`, без смены приближения. Ввод: после щипка отпущенный палец больше не считается тапом (не открывается окно здания). `SceneListFixer` больше не добавляет и не включает MVP1 в Build Settings. Числа камеры — ТЕСТ. | | 05.11.2026 | Claude (Саша) | Перенос 2D-города надёжнее: если места нет, деревья и валуны под зданием расчищаются (бесплатно, без награды — `SettlementMap.ValidateIfCleared`, `ObstaclesUnder`, тест `Placement_IfCleared_IgnoresOnlyTreesAndListsThem`); если места нет и так — здание не теряется, а ждёт в `settlement3d.pendingFrom2D` и ставится при входе в город или когда Ратуша открывает зону. DEV → «Камера»: ползунки наклона, перспективы (поле зрения), ближе / дальше всего и текущего отдаления; подобранное запоминается на устройстве (только редактор и отладочная сборка), «Сбросить» — числа из сцены. | | 05.11.2026 | Claude (Саша) | **Решение команды: только 3D-поселение, камера перспективная.** (1) В 3D перенесены Золотой рудник (золото, Ратуша 2, 50 камня), Кристалл (Ратуша 6, цена из `Data_Kristall`) и Терем (`HeroCastle`, окно героя; фигурка героя гуляет только по 2D-сетке, в 3D — нет). (2) Перенос 2D-города: если в сохранении нет `settlement3d`, а есть 2D-город, при первом входе в 3D Ратуша получает уровень и улучшение из 2D, остальные здания встают на ближайшие свободные места с теми же уровнями и стройками (`City3DController.MoveFrom2D`, итог — в Console «[3D] Перенос 2D-города»). Секция `settlement` в файле не меняется. (3) `SceneNavigator.CitySceneName` = City3D; MVP1 выключена в Build Settings (сцена и код 2D остаются в репозитории до конца проверки). (4) `City3DCamera.perspective` (по умолчанию да, поле зрения 40°) — угол, высота и поле зрения ТЕСТ. Меню стройки — в два столбца. |