namespace Guru.UI { using System; using UnityEngine; using UnityEngine.UI; public class UIRoot : ViewBase { const string PrefabPath = "guru/ui/root_canvas"; private static UIRoot _instance; public static UIRoot Instance { get { if (_instance == null) _instance = LoadInstance(); return _instance; } } /// /// CloneObject 对象 /// /// private static UIRoot LoadInstance() { var ui = CloneResources(PrefabPath); ui.Init(); return ui; } public static T Clone(GameObject prefab, Transform container = null) where T :Component { var go = Instantiate(prefab, container); if (go != null) { go.name = nameof(T).ToLower(); return go.GetComponent(); } return null; } public static T CloneResources(string path, Transform container = null) where T : Component { var prefab = Resources.Load(path); if( null != prefab) return Clone(prefab, container); return null; } private Canvas _canvas; private CanvasScaler _canvasScaler; private Transform _rootNode; private void Init() { DontDestroyOnLoad(gameObject); gameObject.name = "guru_ui"; _rootNode = CreateEmptyNode("root"); _canvas = gameObject.GetComponent(); _canvasScaler = gameObject.GetComponent(); } /// /// 引用分辨率 /// public Vector2 ReferenceResolution { get => _canvasScaler.referenceResolution; set => _canvasScaler.referenceResolution = value; } /// /// 宽高适配 /// public float MatchWidthOrHeight { get => _canvasScaler.matchWidthOrHeight; set => _canvasScaler.matchWidthOrHeight = value; } /// /// 屏幕渲染 Order /// public int SortingOrder { get => _canvas.sortingOrder; set => _canvas.sortingOrder = value; } #region 节点操作 public RectTransform CreateEmptyNode(string nodeName = "node", Transform parent = null) { if (parent == null) parent = transform; var go = new GameObject(nodeName); go.transform.SetParent(parent, false); go.transform.localScale = Vector3.one; var c = go.AddComponent(); c.anchorMax = Vector2.one; c.anchorMin = Vector2.zero; c.sizeDelta = Vector2.zero; c.anchoredPosition = Vector2.zero; c.pivot = Vector2.one * 0.5f; return c; } public RectTransform CreateNodeFromPath(string path, Transform parent = null) { var names = path.Split('/'); if (parent == null) parent = _rootNode; var node = parent as RectTransform; foreach (var n in names) { node = CreateEmptyNode(n, node); } return node; } #endregion } }