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#

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;
}
}
}