using System; using System.Collections.Generic; using System.Threading.Tasks; using DG.Tweening; using UnityEngine; using UnityEngine.UI; #if HotUpdate using YooAsset; #endif namespace Stary.Evo.UIFarme { public interface IBaseRenderPanel : IController { /// /// UI信息 /// string UIName { get; set; } BaseRenderPanel.UITweenType TweenType { get; set; } /// /// 绑定这个面板的实例 /// void Initialize(GameObject panelGo); /// /// 绑定这个面板的实例 /// Task InitializeAsync(GameObject panelGo); /// /// 初始化面板管理器 /// /// void Initialize(ISpriteRenderSystem sysytem); /// /// 初始化面板管理器 /// /// Task InitializeAsync(ISpriteRenderSystem sysytem); /// /// 虚方法,UI进入时执行的操作,只会执行一次 /// void OnEnter(Action complete = null); /// /// 虚方法,UI退出时执行的操作,只会执行一次 /// void OnExit(float delay = 0f); void OnDestroy(); /// /// 生成/获取一个UI对象 /// /// ui信息 /// Task CreatePanel(string packageName, string panelName); /// /// 销毁一个Ui对象 /// /// void DestoryUI(); void SetPanelParent(Transform parent); } /// ///所有UI面板的父类,包含UI面板的状态信息 /// public class BaseRenderPanel : IBaseRenderPanel { /// /// UI信息 /// public virtual string UIName { get; set; } public UITweenType TweenType { get; set; } /// /// 面板管理器 /// protected ISpriteRenderSystem PanelSystem { get; private set; } /// /// 生成的父物体 /// protected Transform panelParent { get; private set; } /// /// 缓存该面板所有的SpriteRenderer /// private Dictionary spriteRendererDict; protected GameObject activePanel { get; private set; } public virtual void Initialize(GameObject panelGo) { activePanel = panelGo; spriteRendererDict = new Dictionary(); SpriteRenderer[] spriteRenderers = activePanel.GetComponentsInChildren(true); foreach (SpriteRenderer item in spriteRenderers) { spriteRendererDict.Add(item.name,item); } } public virtual Task InitializeAsync(GameObject panelGo) { Initialize(panelGo); return Task.CompletedTask; } public virtual void Initialize(ISpriteRenderSystem sysytem) { PanelSystem = sysytem; } public virtual Task InitializeAsync(ISpriteRenderSystem sysytem) { Initialize(sysytem); return Task.CompletedTask; } public virtual void OnEnter(Action complete = null) { activePanel.SetActive(true); SetCanvasGroupTween(1f, complete); } public virtual void OnExit(float delay = 0f) { SetCanvasGroupTween(0f, () => { activePanel.SetActive(false); }); } public virtual void OnDestroy() { DestoryUI(); } public async Task CreatePanel(string packageName, string panelName) { if (panelParent == null) { Debug.LogWarning($"UnityEvo:parent为空,{panelName}自动设置为root节点下,请检查是否正确!!!!!"); } if (this.activePanel != null) { return activePanel.gameObject; } #if HotUpdate AssetHandle handle = null; if (packageName == null) { handle = YooAssets.LoadAssetAsync(panelName); } else { var package = YooAssets.TryGetPackage(packageName); if (package == null) { handle = YooAssets.LoadAssetAsync(panelName); } else { handle = package.LoadAssetAsync(panelName); } } await handle.Task; activePanel = GameObject.Instantiate(handle.AssetObject as GameObject, panelParent); #else GameObject handle = Resources.Load(panelName); activePanel = GameObject.Instantiate(handle, panelParent); #endif activePanel.name = panelName; return activePanel; } public void DestoryUI() { if (activePanel != null) { GameObject.Destroy(activePanel); PanelSystem.Get_Dic().Remove(this.GetType().Name); } } public void SetPanelParent(Transform parent) { panelParent = parent; } private void SetCanvasGroup(float alpha) { foreach (var spriteRenderer in spriteRendererDict) { Color c = spriteRenderer.Value.color; c.a = alpha; spriteRenderer.Value.color = c; } } private void SetCanvasGroupTween(float alpha, Action complete = null) { // 创建一个新的序列 Sequence sequence = DOTween.Sequence(); foreach (var spriteRenderer in spriteRendererDict) { if (TweenType == UITweenType.None) { Color c = spriteRenderer.Value.color; c.a = alpha; spriteRenderer.Value.color = c; } else if (TweenType == UITweenType.Fade) { sequence.Join(spriteRenderer.Value.DOFade(alpha, 1f)); } // else if (TweenType == UITweenType.Yoyo) // { // sequence.Join(spriteRenderer.Value.DOFade(alpha, 1f) // .SetLoops(-1, LoopType.Yoyo)); // } } if (TweenType == UITweenType.None) { complete?.Invoke(); } else { sequence.OnComplete(() => complete?.Invoke()); sequence.Play(); } } public IArchitecture GetArchitecture() { return PanelSystem.GetArchitecture(); } public enum UITweenType { /// /// 无动画 /// None, /// /// 淡入淡出 /// Fade, } } }