using System.Collections.Generic; using Cysharp.Threading.Tasks; using FairyGUI; using Script.FrameWork.EventSystem; using UnityEngine; using YooAsset; namespace Script.FrameWork.UI { public class UIPage { private GComponent _panel; private Window _window; private bool _isShow; public bool IsLoaded; public bool IsLoading; public UIParam Param; private Dictionary> _eventDic = new(); // ui cache private Dictionary _cacheComponents = new(); private Dictionary _cacheControllers = new(); private Dictionary _cacheTransitions = new(); public UIPage() { IsLoading = false; IsLoaded = false; } public void Create(Window window, GComponent panel) { _window = window; _panel = panel; IsLoading = false; IsLoaded = true; OnCreate(); } public void Init(UIParam param) { Param = param; OnInit(param); } public void InitEvents() { } public void Show() { if (IsLoading || !IsLoaded) return; if (!_isShow) { _window.Show(); _isShow = true; OnShow(); } } public void Hide() { if (IsLoading || !IsLoaded) return; if (_isShow) { _window.Hide(); _isShow = false; OnHide(); } } public async UniTask Close() { if (IsLoaded) { // Fade Out var outTransition = _panel.GetTransition("Out"); if (outTransition != null) { outTransition.Play(); await UniTask.WaitUntil(() => !outTransition.playing); } _window.Dispose(); _panel.Dispose(); _window = null; _panel = null; IsLoaded = false; } _isShow = false; _cacheComponents.Clear(); _cacheControllers.Clear(); } public void Update(float deltaTime) { OnUpdate(deltaTime); } public void Destroy() { OnDestroy(); } public void AddEventListener(int eventKey, Dispatcher handler) { if (!_eventDic.TryGetValue(eventKey, out var dispatchers)) { dispatchers = new List(); _eventDic.Add(eventKey, dispatchers); } } protected void SetSortingOrder(int sortingOrder) { _window.sortingOrder = sortingOrder; } protected T GetChild(string childName) where T : GObject { if (_cacheComponents.TryGetValue(childName, out var com)) return (T)com; com = _panel.GetChild(childName); _cacheComponents.Add(childName, com); return (T)com; } protected T GetChildByPath(string childPath) where T : GComponent { if (_cacheComponents.TryGetValue(childPath, out var com)) return (T)com; com = _panel.GetChildByPath(childPath).asCom; _cacheComponents.Add(childPath, com); return (T)com; } protected Controller GetController(string controllerName) { if (_cacheControllers.TryGetValue(controllerName, out var controller)) return controller; return _panel.GetController(controllerName); } protected Transition GetTransition(string transitionName) { if (_cacheTransitions.TryGetValue(transitionName, out var transition)) return transition; return _panel.GetTransition(transitionName); } protected virtual void OnCreate() { } protected virtual void OnInit(UIParam param = null) { } protected virtual void OnInitEvents() { } protected virtual void OnShow() { } protected virtual void OnHide() { } protected virtual void OnClose() { } protected virtual void OnUpdate(float deltaTime) { } protected virtual void OnDestroy() { } protected T CreateUGUIGraph(GGraph holder, string uguiName) { var canvasGo = new GameObject("Canvas"); var canvas = canvasGo.AddComponent(); canvas.renderMode = RenderMode.WorldSpace; canvas.worldCamera = StageCamera.main; var prefab = YooAssets.LoadAssetSync(uguiName).AssetObject as GameObject; var go = GameObject.Instantiate(prefab, canvasGo.transform, true); var size = holder.size; canvas.GetComponent().sizeDelta = size; go.GetComponent().sizeDelta = size; var gw = new GoWrapper(canvasGo); holder.displayObject.Dispose(); holder.SetNativeObject(gw); return go.GetComponent(); } } }