using UnityEngine; using UnityEngine.UI; using UnityEditor; using UnityEditor.SceneManagement; // HUD ПРИКРЕПЛЁН К КАМЕРЕ (Canvas: Screen Space - Camera): // - HUD рисуется камерой и всегда занимает экран одинаково -- при зуме и перемещении не плывёт и не масштабируется // - карту можно двигать и зумить (CameraController), клики по кнопкам HUD работают // - спрайты внутри HUD (например "Рамка в середине") рисуются правильно -- в этом режиме Canvas живёт в мире перед камерой // - CameraZoom больше не нужен (он масштабировал HUD вручную и делал это в обратную сторону) // // Применяется сам один раз после компиляции, если сцена ещё не в этом режиме. Вручную: Tools -> HUD: Attach To Camera. [InitializeOnLoad] public static class RestoreOldCamera { static readonly Vector2 DesignSize = new Vector2(2007.7732f, 1032.786f); // размер, под который собран HUD static RestoreOldCamera() { EditorApplication.delayCall += Auto; } static void Auto() { if (EditorApplication.isPlayingOrWillChangePlaymode) return; var hud = GameObject.Find("HUD_Canvas"); var cam = Camera.main; if (hud == null || cam == null) return; var canvas = hud.GetComponent(); var sc = hud.GetComponent(); bool ok = canvas != null && canvas.renderMode == RenderMode.ScreenSpaceCamera && canvas.worldCamera == cam && cam.GetComponent() == null && cam.GetComponent() == null && sc != null && sc.enabled && sc.screenMatchMode == CanvasScaler.ScreenMatchMode.Expand; if (!ok) Apply(); } [MenuItem("Tools/HUD: Attach To Camera")] public static void Apply() { var cam = Camera.main; var hud = GameObject.Find("HUD_Canvas"); if (cam == null || hud == null) { Debug.LogError("Нужны Main Camera и HUD_Canvas"); return; } // ---- камера: только CameraController (перемещение + зум) ---- foreach (var c in cam.GetComponents()) Object.DestroyImmediate(c); foreach (var c in cam.GetComponents()) Object.DestroyImmediate(c); var ctrl = cam.GetComponent(); if (ctrl == null) { ctrl = cam.gameObject.AddComponent(); ctrl.moveSpeed = 5f; ctrl.zoomSpeed = 2f; ctrl.minOrthoSize = 2f; ctrl.maxOrthoSize = 50f; } ctrl.enabled = true; cam.orthographic = true; cam.transform.localScale = Vector3.one; cam.transform.rotation = Quaternion.identity; if (cam.orthographicSize < 2f || cam.orthographicSize > 50f) cam.orthographicSize = 10f; // ---- HUD: Screen Space - Camera ---- var canvas = hud.GetComponent(); var rt = (RectTransform)hud.transform; if (rt.parent != null) rt.SetParent(null, false); canvas.renderMode = RenderMode.ScreenSpaceCamera; canvas.worldCamera = cam; canvas.planeDistance = 5f; // между камерой (z=-10) и картой (z=0) canvas.sortingOrder = 100; // поверх зданий rt.localRotation = Quaternion.identity; var scaler = hud.GetComponent(); if (scaler == null) scaler = hud.AddComponent(); scaler.enabled = true; scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = DesignSize; // Expand: весь HUD (2007x1032) всегда помещается на экран целиком -- и в узком окне, и на широком телефоне scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.Expand; // спрайты внутри HUD -- поверх карты foreach (var sr in hud.GetComponentsInChildren(true)) { if (sr.sortingOrder < 100) sr.sortingOrder = 100; if (!sr.gameObject.activeSelf) sr.gameObject.SetActive(true); } EditorSceneManager.MarkSceneDirty(hud.scene); Debug.Log("HUD прикреплён к камере (Screen Space - Camera), CameraZoom убран. Сохрани сцену: Ctrl+S."); } }