NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/UIRoot.cs

232 lines
6.6 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00

using UnityEngine;
using System;
using System.IO;
using Cysharp.Threading.Tasks;
using UnityEngine.UI;
using Object = UnityEngine.Object;
2023-10-19 15:00:19 +08:00
using System.Reflection;
using System.Linq;
using PhxhSDK;
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public partial class UIRoot : SingletonMono<UIRoot>
2023-08-22 19:08:45 +08:00
{
public Canvas RootCanvas;
// 所有UI的根节点
public GameObject Root;
public Camera UICamera;
public Camera UITopCamera;
public GameObject UITopRoot;
2023-08-22 19:08:45 +08:00
// [Range(-5, 5)]
// public float offsetX = 1.32f;
// [Range(-5, 5)]
// public float offsetY = 1.26f;
// [Range(-5, 5)]
// public float offsetZ = 0.83f;
2023-08-22 19:08:45 +08:00
public enum ECanvasScaler
{
S1365_768,
S1334_750,
}
// Loading节点
//public GameObject mUILoading;
// 尝试修复花屏的问题
bool isDirty = false;
Font dirtyFont = null;
public void Awake()
{
Object.DontDestroyOnLoad(this.gameObject);
Font.textureRebuilt += delegate (Font font1)
{
isDirty = true;
dirtyFont = font1;
};
2023-10-19 15:00:19 +08:00
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
2023-08-22 19:08:45 +08:00
//mUILoading.AddComponent(typeof(SliderZero));
}
2023-08-22 19:08:45 +08:00
private void LateUpdate()
{
if (isDirty)
{
isDirty = false;
foreach (Text text in FindObjectsOfType<Text>())
{
if (text.font == dirtyFont)
{
text.FontTextureChanged();
}
}
dirtyFont = null;
}
}
/// <summary>
/// Creates the window.
/// </summary>
/// <returns>The window.</returns>
/// <param name="windowName">UI预设名</param>
/// <param name="type">UI类型</param>
/// <param name="layer">UI层级</param>
2023-11-21 13:31:06 +08:00
public async UniTask<UIWindow> CreateWindow(string windowName, UIWindowLayer layer = UIWindowLayer.Normal)
2023-08-22 19:08:45 +08:00
{
GameObject uiPrefab = await LoadPrefab(windowName);
if (uiPrefab == null)
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("{0}.CreateWindow, cannot find window resource : {1}", GetType(), windowName);
2023-08-22 19:08:45 +08:00
return null;
}
UIWindow window = null;
GameObject obj = Instantiate(uiPrefab, Root.transform, false) as GameObject;
string[] dirs = windowName.Split('/');
string className = dirs[dirs.Length - 1] + "Controller";
2024-01-26 16:06:42 +08:00
//window = obj.AddComponent(CommonUtilsFramework.GamePlayAssembly.GetType(className)) as UIWindow;
window = CommonUtilsFramework.GamePlayAssembly.CreateInstance(className) as UIWindow;
UIManager.BindWindowObj(window, obj);
2023-08-22 19:08:45 +08:00
if (window == null)
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("Cant find UIWindow: {0}, check the name or remove any outter namespace.", className);
2023-08-22 19:08:45 +08:00
return null;
}
return window;
}
async UniTask<GameObject> LoadObj(string windowName)
{
GameObject uiPrefab = null;
var path = string.Format(UIManager.UI_PREFAB_PATH, windowName);
2023-10-19 15:00:19 +08:00
uiPrefab = await AssetManager.Instance.LoadAssetAsync<GameObject>(path);
2023-08-22 19:08:45 +08:00
return uiPrefab;
}
private async UniTask<GameObject> LoadPrefab(string wName)
{
string windowName = wName;
GameObject uiPrefab = null;
// if (CommonUtils.IsLE_16_10())
// {
// uiPrefab = LoadObj(windowName + "_Pad");
// if (uiPrefab == null)// 增加一层兼容。如果ab包里加载不到就去Resources目录里加载
// {
// uiPrefab = Resources.Load<GameObject>(Path.Combine("Loading",windowName + "_Pad"));
// }
// }
if (uiPrefab == null)
{
uiPrefab = await LoadObj(windowName);
if (uiPrefab == null) // 增加一层兼容。如果ab包里加载不到就去Resources目录里加载
{
uiPrefab = Resources.Load<GameObject>(Path.Combine("Loading",windowName));
}
}
return uiPrefab;
}
public Vector2 GetScreenCanvasScale()
{
var rectTransform = Root.GetComponent<RectTransform>();
var screenSize = new Vector2(Screen.width, Screen.height);
2023-10-19 15:00:19 +08:00
var rect = rectTransform.rect;
return new Vector2(screenSize.x / rect.width, screenSize.y / rect.height);
2023-08-22 19:08:45 +08:00
}
public void EnableTouch(bool b)
{
var cg = RootCanvas.GetComponent<CanvasGroup>();
cg.interactable = b;
cg.blocksRaycasts = b;
}
2024-07-03 14:07:54 +08:00
/// <summary>
/// 是否激活射线检测
/// </summary>
/// <param name="isEnable"></param>
public void IsEnableGraphicRaycaster(bool isEnable)
{
GraphicRaycaster graphicRaycaster = Root.GetComponent<GraphicRaycaster>();
if (null == graphicRaycaster)
return;
graphicRaycaster.enabled = isEnable;
}
2024-09-06 14:44:11 +08:00
/// <summary>
/// 新手引导是否激活射线检测(新手引导用)
/// </summary>
/// <param name="isEnable"></param>
public void IsEnableGraphicRaycasterByGuide(bool isEnable)
{
foreach (var kv in UIManager.Instance.mMemoryWindows)
{
if (UINameConst.UIFightScene == kv.Key)
continue;
if (UINameConst.UINoticeOne == kv.Key)
continue;
if (UINameConst.UINoticeTwo == kv.Key)
continue;
if (!kv.Value.gameObject.TryGetComponent(out GraphicRaycaster graphicRaycaster))
2024-09-06 14:44:11 +08:00
graphicRaycaster = kv.Value.gameObject.AddComponent<GraphicRaycaster>();
GraphicRaycaster[] graphicRaycasters = kv.Value.gameObject.GetComponentsInChildren<GraphicRaycaster>();
foreach (GraphicRaycaster gr in graphicRaycasters)
{
gr.enabled = isEnable;
}
2024-09-06 14:44:11 +08:00
}
}
2023-08-22 19:08:45 +08:00
public void SwitchCanvasScaler(ECanvasScaler scaler)
{
CanvasScaler cs = RootCanvas.transform.GetComponent<CanvasScaler>();
if (cs != null)
{
switch (scaler)
{
case ECanvasScaler.S1365_768:
cs.referenceResolution = new Vector2(1365, 768);
break;
case ECanvasScaler.S1334_750:
default:
cs.referenceResolution = new Vector2(1334, 750);
break;
}
}
}
public void EnterUITopState()
{
UITopCamera.gameObject.SetActive(true);
}
public void ExitUITopState()
{
UITopCamera.gameObject.SetActive(false);
}
public void AddUI2UITopRoot(GameObject obj)
{
if (UITopRoot)
{
obj.transform.SetParent(UITopRoot.transform);
}
}
2023-08-22 19:08:45 +08:00
}