Files
plugin-library/Assets/06.UIFarme/RunTime/UIFramework/UIViewBase/UIViewController.cs
2025-09-23 11:18:38 +08:00

201 lines
5.9 KiB
C#

using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using Unity.VisualScripting;
using UnityEngine;
using YooAsset;
namespace Stary.Evo
{
public class UIViewController
{
// 配置
public string uiType;
public string uiPath;
public Type uiViewType;
public UILayerLogic uiLayer;
public bool isWindow;
public UIView uiView;
public UIViewAnim uiViewAnim;
public bool isLoading = false;
public bool isOpen = false;
public bool isPause = false;
public int order;
/// <summary>
/// 在我上面的界面(非窗口界面)的数量
/// </summary>
public int topViewNum;
public async UniTask Load(object userData = null, Action callback = null)
{
isLoading = true;
if (isOpen)
{
order = uiLayer.PopOrder(this);
}
var handle = YooAssets.LoadAssetSync<GameObject>(uiPath);
await handle.Task;
GameObject go = handle.InstantiateSync();
if (!isLoading)
{
//ResourceManager.Instance.GetResourceCore(UIConfig.UIPackageName).Recycle(go);
callback?.Invoke();
Release();
return;
}
isLoading = false;
uiView = (UIView)go.GetOrAddComponent(uiViewType);
uiViewAnim = go.GetComponent<UIViewAnim>();
uiView.transform.SetParentEx(uiLayer.canvas.transform);
RectTransform rectTransform = uiView.transform as RectTransform;
switch (UIManager.Instance.GetUIBlackType())
{
case UIBlackType.None:
// 全适配
rectTransform.SetAnchor(AnchorPresets.StretchAll);
rectTransform.anchoredPosition = Vector2.zero;
rectTransform.sizeDelta = Vector2.zero;
break;
case UIBlackType.Height:
// 保持高度填满,两边留黑边
rectTransform.SetAnchor(AnchorPresets.VertStretchCenter);
rectTransform.anchoredPosition = Vector2.zero;
rectTransform.sizeDelta = new Vector2(UIManager.Instance.width, 0);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal,
UIManager.Instance.width);
break;
case UIBlackType.Width:
// 保持宽度填满,上下留黑边
rectTransform.SetAnchor(AnchorPresets.HorStretchMiddle);
rectTransform.anchoredPosition = Vector2.zero;
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical,
UIManager.Instance.height);
rectTransform.sizeDelta = new Vector2(0, UIManager.Instance.height);
break;
}
uiView.OnInit(go.GetComponent<UIControlData>(), this);
uiView.transform.SetAsLastSibling();
await UniTask.CompletedTask;
}
public async UniTask Load<T>(object userData = null, Action callback = null)
{
uiViewType = typeof(T);
await Load(userData, callback);
if (isOpen)
{
Open<T>(userData, callback, true);
}
else
{
Close(callback);
}
}
public async void Open<T>(object userData = null, Action callback = null, bool isFirstOpen = false)
{
isOpen = true;
if (isLoading) return;
if (uiView == null)
{
await Load<T>(userData, callback);
}
else
{
if (!isFirstOpen && isOpen && order > 0)
{
TrueClose();
}
TrueOpen(userData, callback);
if (uiViewAnim != null)
{
uiViewAnim.Open();
}
}
}
public void Close(Action callback = null)
{
isOpen = false;
if (isLoading) return;
if (uiView != null)
{
if (uiViewAnim != null)
{
uiViewAnim.Close(() => { TrueClose(callback); });
}
else
{
TrueClose(callback);
}
}
}
public void Release()
{
if (uiView != null)
{
if (isOpen)
TrueClose();
uiView.OnRelease();
GameObject.Destroy(uiView.gameObject);
}
uiView = null;
uiViewAnim = null;
isLoading = false;
isOpen = false;
order = 0;
}
private void TrueOpen(object userData = null, Action callback = null)
{
uiLayer.OpenUI(this);
SetVisible(true);
// 刷新一下显示
AddTopViewNum(0);
uiView.OnOpen(userData);
uiView.OnResume();
callback?.Invoke();
}
private void TrueClose(Action callback = null)
{
uiLayer.CloseUI(this);
// 刷新一下显示
AddTopViewNum(-100000);
SetVisible(false);
uiView.OnPause();
uiView.OnClose();
callback?.Invoke();
}
public void SetVisible(bool visible)
{
if (uiView != null)
{
uiView.gameObject.SetActive(visible);
}
}
public void AddTopViewNum(int num)
{
topViewNum += num;
topViewNum = Mathf.Max(0, topViewNum);
SetVisible(topViewNum <= 0);
}
}
}