You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.0 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using FairyGUI;
using YooAsset;
namespace Script.FrameWork.UI
{
public class UIManager : Singleton<UIManager>
{
private Dictionary<string, UIPage> _uiPages = new();
// 资源句柄列表
private Dictionary<string, AssetHandle> _handles = new();
// 常驻资源白名单
private List<string> _permanentPackages = new();
private object LoadFunc(string name, string extension, System.Type type, out DestroyMethod method)
{
method = DestroyMethod.None; //注意这里一定要设置为None
var package = YooAssets.GetPackage("DefaultPackage");
var handle = package.LoadAssetSync(name , type);
if (!_handles.ContainsKey(name))
_handles.Add(name, handle);
return handle.AssetObject;
}
public override void Init()
{
// UIPackage.AddPackage("Common", LoadFunc);
// UIPackage.AddPackage("Sound", LoadFunc);
// UIPackage.AddPackage("PageLoading", LoadFunc);
// UIConfig.buttonSound = (NAudioClip)UIPackage.GetItemAssetByURL("ui://Sound/Click");
// GRoot.inst.EnableSound();
}
public override void UnInit()
{
}
public bool IsActive<T>()
{
var pageName = typeof(T).Name;
if (_uiPages.TryGetValue(pageName, out var page))
return page.IsLoaded;
return false;
}
public async UniTask ShowUI<T>(string resPath = "", UIParam param = null) where T : UIPage, new()
{
string pkgName;
string resName;
if (!string.IsNullOrEmpty(resPath))
{
if (!GetUIPkgAndResName(resPath, out pkgName, out resName))
return;
}
else
{
pkgName = typeof(T).Name;
resName = typeof(T).Name;
}
UIPackage.AddPackage(pkgName, LoadFunc);
if (!_uiPages.TryGetValue(resName, out var uiPage))
{
uiPage = new T();
_uiPages.Add(resName, uiPage);
}
if (uiPage.IsLoaded)
{
uiPage.Show();
}
else
{
if (uiPage.IsLoading)
{
// 正在加载中
}
else
{
UIPackage.CreateObjectAsync(pkgName, resName, obj =>
{
float width = GRoot.inst.width;
float height = GRoot.inst.height;
var panel = obj as GComponent;
var window = new Window
{
contentPane = panel
};
// window.x = width / 2 - window.width / 2;
// window.y = height / 2 - window.height / 2;
panel.SetSize(width, height);
uiPage.Create(window, panel);
uiPage.Init(param);
uiPage.InitEvents();
uiPage.Show();
});
uiPage.IsLoading = true;
await UniTask.WaitUntil(() => uiPage.IsLoaded);
}
}
}
public async UniTask CloseUI<T>()
{
var pageName = typeof(T).Name;
// packageName和pageName一致
var packageName = pageName;
if (_uiPages.TryGetValue(pageName, out var page))
{
if (page.IsLoaded)
{
await page.Close();
}
_uiPages.Remove(pageName);
if (!_permanentPackages.Contains(packageName))
{
if (_handles.TryGetValue(packageName, out var handle))
{
handle.Release();
_handles.Remove(packageName);
}
}
UIPackage.RemovePackage(packageName);
}
}
public void Update(float deltaTime)
{
foreach (var (uiName, page) in _uiPages)
{
if (page.IsLoading || !page.IsLoaded) continue;
page.Update(deltaTime);
}
}
private bool GetUIPkgAndResName(string resPath, out string pkgName, out string resName)
{
pkgName = "";
resName = "";
var arr = resPath.Split('/');
if (arr.Length < 2)
{
LogHelper.LogError($"UI ResPath Error: {resPath}");
return false;
}
pkgName = arr[0];
resName = arr[1];
return true;
}
}
}