using UnityEngine; using UnityEngine.UI; namespace AOT.UI { /// /// 启动更新条(运行时生成,竖屏安全区友好)。 /// public sealed class BootPatchView : MonoBehaviour { Text _status; Image _fill; public static BootPatchView Create() { var root = new GameObject("BootPatchUI"); DontDestroyOnLoad(root); var canvasGo = new GameObject("Canvas"); canvasGo.transform.SetParent(root.transform, false); var canvas = canvasGo.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 1000; canvasGo.AddComponent().uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; var scaler = canvasGo.GetComponent(); scaler.referenceResolution = new Vector2(1080, 1920); scaler.matchWidthOrHeight = 0.5f; canvasGo.AddComponent(); var bg = CreateUiObject("Background", canvasGo.transform); var bgImage = bg.AddComponent(); bgImage.color = new Color(0.08f, 0.09f, 0.12f, 1f); StretchFull(bg.GetComponent()); var title = CreateUiObject("Title", canvasGo.transform); var titleText = title.AddComponent(); titleText.font = Resources.GetBuiltinResource("LegacyRuntime.ttf"); titleText.text = "AIGame"; titleText.alignment = TextAnchor.MiddleCenter; titleText.fontSize = 64; titleText.color = Color.white; var titleRt = title.GetComponent(); titleRt.anchorMin = new Vector2(0.1f, 0.62f); titleRt.anchorMax = new Vector2(0.9f, 0.72f); titleRt.offsetMin = Vector2.zero; titleRt.offsetMax = Vector2.zero; var statusGo = CreateUiObject("Status", canvasGo.transform); var status = statusGo.AddComponent(); status.font = Resources.GetBuiltinResource("LegacyRuntime.ttf"); status.text = "启动中…"; status.alignment = TextAnchor.MiddleCenter; status.fontSize = 28; status.color = new Color(0.85f, 0.88f, 0.92f, 1f); var statusRt = statusGo.GetComponent(); statusRt.anchorMin = new Vector2(0.1f, 0.42f); statusRt.anchorMax = new Vector2(0.9f, 0.5f); statusRt.offsetMin = Vector2.zero; statusRt.offsetMax = Vector2.zero; var barBg = CreateUiObject("ProgressBg", canvasGo.transform); var barBgImage = barBg.AddComponent(); barBgImage.color = new Color(1f, 1f, 1f, 0.12f); var barBgRt = barBg.GetComponent(); barBgRt.anchorMin = new Vector2(0.15f, 0.36f); barBgRt.anchorMax = new Vector2(0.85f, 0.39f); barBgRt.offsetMin = Vector2.zero; barBgRt.offsetMax = Vector2.zero; var barFill = CreateUiObject("ProgressFill", barBg.transform); var fill = barFill.AddComponent(); fill.color = new Color(0.35f, 0.75f, 0.55f, 1f); var fillRt = barFill.GetComponent(); fillRt.anchorMin = Vector2.zero; fillRt.anchorMax = new Vector2(0f, 1f); fillRt.offsetMin = Vector2.zero; fillRt.offsetMax = Vector2.zero; fillRt.pivot = new Vector2(0f, 0.5f); var view = root.AddComponent(); view._status = status; view._fill = fill; return view; } public void SetStatus(string text) { if (_status != null) _status.text = text ?? string.Empty; } public void SetProgress(float normalized01) { if (_fill == null) return; float v = Mathf.Clamp01(normalized01); var rt = _fill.rectTransform; rt.anchorMax = new Vector2(v, 1f); } public void SetError(string message) { SetStatus(message); if (_fill != null) _fill.color = new Color(0.85f, 0.3f, 0.3f, 1f); } static GameObject CreateUiObject(string name, Transform parent) { var go = new GameObject(name, typeof(RectTransform)); go.transform.SetParent(parent, false); return go; } static void StretchFull(RectTransform rt) { rt.anchorMin = Vector2.zero; rt.anchorMax = Vector2.one; rt.offsetMin = Vector2.zero; rt.offsetMax = Vector2.zero; } } }