com.guru.unity.applit/Runtime/Framework/UI/UIRoot.cs

142 lines
3.6 KiB
C#

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;
}
}
/// <summary>
/// CloneObject 对象
/// </summary>
/// <returns></returns>
private static UIRoot LoadInstance()
{
var ui = CloneResources<UIRoot>(PrefabPath);
ui.Init();
return ui;
}
public static T Clone<T>(GameObject prefab, Transform container = null) where T :Component
{
var go = Instantiate(prefab, container);
if (go != null)
{
go.name = nameof(T).ToLower();
return go.GetComponent<T>();
}
return null;
}
public static T CloneResources<T>(string path, Transform container = null) where T : Component
{
var prefab = Resources.Load<GameObject>(path);
if( null != prefab) return Clone<T>(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<Canvas>();
_canvasScaler = gameObject.GetComponent<CanvasScaler>();
}
/// <summary>
/// 引用分辨率
/// </summary>
public Vector2 ReferenceResolution
{
get => _canvasScaler.referenceResolution;
set => _canvasScaler.referenceResolution = value;
}
/// <summary>
/// 宽高适配
/// </summary>
public float MatchWidthOrHeight
{
get => _canvasScaler.matchWidthOrHeight;
set => _canvasScaler.matchWidthOrHeight = value;
}
/// <summary>
/// 屏幕渲染 Order
/// </summary>
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<RectTransform>();
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
}
}