85 lines
4.5 KiB
C#
85 lines
4.5 KiB
C#
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<Canvas>();
|
|
var sc = hud.GetComponent<CanvasScaler>();
|
|
bool ok = canvas != null && canvas.renderMode == RenderMode.ScreenSpaceCamera && canvas.worldCamera == cam
|
|
&& cam.GetComponent<CameraZoom>() == null && cam.GetComponent<CityCamera>() == 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<CityCamera>()) Object.DestroyImmediate(c);
|
|
foreach (var c in cam.GetComponents<CameraZoom>()) Object.DestroyImmediate(c);
|
|
var ctrl = cam.GetComponent<CameraController>();
|
|
if (ctrl == null)
|
|
{
|
|
ctrl = cam.gameObject.AddComponent<CameraController>();
|
|
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<Canvas>();
|
|
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<CanvasScaler>();
|
|
if (scaler == null) scaler = hud.AddComponent<CanvasScaler>();
|
|
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<SpriteRenderer>(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.");
|
|
}
|
|
}
|