using UnityEngine; using UnityEngine.UI; namespace Vanguard.UI { /// /// Фон Lobby: процедурный тёмно-синий градиент с сеткой, центральным /// свечением и виньеткой. Кешируется как один спрайт; когда появится /// key art, достаточно заменить источник изображения. /// public static class LobbyBackdrop { public const string RootName = "LobbyBackdrop"; private static Sprite _sprite; public static RectTransform Create(Transform parent) { var go = new GameObject(RootName, typeof(RectTransform), typeof(Image)); var rect = (RectTransform)go.transform; rect.SetParent(parent, false); UiKit.Stretch(rect); rect.SetAsFirstSibling(); var image = go.GetComponent(); image.sprite = Sprite(); image.type = Image.Type.Simple; image.preserveAspect = false; image.raycastTarget = false; return rect; } private static Sprite Sprite() { if (_sprite != null) return _sprite; const int width = 512; const int height = 288; var pixels = new Color32[width * height]; var top = new Color(0.010f, 0.026f, 0.070f); var middle = new Color(0.017f, 0.055f, 0.135f); var bottom = new Color(0.006f, 0.016f, 0.045f); var glow = new Color(0.06f, 0.26f, 0.62f); var grid = new Color(0.16f, 0.46f, 0.92f); for (var y = 0; y < height; y++) { var v = y / (float)(height - 1); var baseColor = v < 0.55f ? Color.Lerp(bottom, middle, v / 0.55f) : Color.Lerp(middle, top, (v - 0.55f) / 0.45f); for (var x = 0; x < width; x++) { var u = x / (float)(width - 1); var color = baseColor; // Мягкое пятно света над центром сцены. var dx = (u - 0.5f) * 2f; var dy = (v - 0.62f) * 2.2f; var distance = Mathf.Sqrt(dx * dx + dy * dy); var light = Mathf.Clamp01(1f - distance / 1.15f); color += glow * (light * light * 0.16f); // Сетка с шагом 32 px по текстуре. if (x % 32 == 0 || y % 32 == 0) color += grid * 0.035f; // Виньетка по краям. var vignette = Mathf.Clamp01( (Mathf.Abs(dx) * 0.55f + Mathf.Abs(v - 0.5f) * 1.1f - 0.35f) / 0.65f); color = Color.Lerp(color, new Color(0f, 0f, 0f), vignette * 0.55f); color.a = 1f; pixels[y * width + x] = color; } } var texture = new Texture2D(width, height, TextureFormat.RGBA32, false) { hideFlags = HideFlags.DontSave, wrapMode = TextureWrapMode.Clamp, filterMode = FilterMode.Bilinear, name = "LobbyBackdrop", }; texture.SetPixels32(pixels); texture.Apply(false, false); _sprite = UnityEngine.Sprite.Create( texture, new Rect(0f, 0f, width, height), new Vector2(0.5f, 0.5f), 100f, 0, SpriteMeshType.FullRect); _sprite.name = "LobbyBackdrop"; _sprite.hideFlags = HideFlags.DontSave; return _sprite; } } }