3D: камера в пределах открытых зон, при отдалении видна вся зона, плавный зум, без тапа после щипка; MVP1 не возвращается в сборку; навыки героя без символа, которого нет в шрифте

This commit is contained in:
2026-11-06 13:17:56 +03:00
parent 0ebbf56306
commit de105c4cbe
5 changed files with 145 additions and 23 deletions
+15 -3
View File
@@ -199,6 +199,7 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
if (d == null) MoveFrom2D(); // 3D-города в сохранении ещё нет, а 2D есть -- перенести постройки игрока
}
else if (pendingFrom2D.Count > 0) PlacePendingFrom2D(); // здания из 2D, которые ждали места
UpdateCameraArea();
UpdateGrass();
RefreshGround();
if (CitySync.Instance != null) CitySync.Instance.SyncNow();
@@ -349,6 +350,7 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
cameraRig = cam.GetComponent<City3DCamera>() ?? cam.gameObject.AddComponent<City3DCamera>();
cameraRig.bounds = new Rect(2, 2, City3DLayout.Size - 4, City3DLayout.Size - 4);
cameraRig.target = new Vector3(City3DLayout.Size / 2f, 0, City3DLayout.Size / 2f);
UpdateCameraArea();
cameraRig.Apply();
Map3D.SetUpLook(cam, 30f, 85f); // солнце, небо, дымка вдали
@@ -696,8 +698,7 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
{
ghostX = fx; ghostY = fy; ghostRot = frot;
// камера плавно подъезжает к месту, не меняя приближения
float size = cameraRig.distance / 1.15f;
cameraRig.FocusOn(new Rect(fx + t.W / 2f - size / 2f, fy + t.H / 2f - size / 2f, size, size));
cameraRig.MoveTo(new Vector3(fx + t.W / 2f, 0, fy + t.H / 2f));
}
EnsureFootprint();
RefreshGround();
@@ -830,7 +831,9 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
Vector3 pos;
if (Input.touchCount > 0)
{
if (Input.touchCount > 1) { cameraRig.EndPan(); draggingGhost = false; return; } // два пальца -- зум камеры
// два пальца -- зум камеры. Касание считается перетаскиванием: когда пальцы отпустят, это не тап
// (иначе после щипка открывалось окно здания под оставшимся пальцем) (06.11)
if (Input.touchCount > 1) { cameraRig.EndPan(); draggingGhost = false; pointerMoved = true; return; }
Touch touch = Input.GetTouch(0);
pos = touch.position;
down = touch.phase == TouchPhase.Began;
@@ -974,6 +977,7 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
int before = townHallLevel;
townHallLevel = Mathf.Clamp(level, 1, 5);
if (townHallLevel == before) return;
UpdateCameraArea();
RefreshGround();
if (ghost != null) UpdateGhost();
if (townHallLevel > before)
@@ -986,6 +990,14 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
}
}
// Камера: центр кадра -- только над открытой зоной, при самом дальнем отдалении видна вся зона (06.11)
void UpdateCameraArea()
{
if (cameraRig == null) return;
int half = City3DLayout.ZoneHalfSize(townHallLevel), c = City3DLayout.Size / 2;
cameraRig.SetOpenArea(new Rect(c - half, c - half, half * 2, half * 2));
}
void Say(string text)
{
message = text;