using UnityEngine; using Cysharp.Threading.Tasks; public abstract class UIBase : MonoBehaviour { public abstract string UIName { get; } [Header("渐变设置")] [SerializeField] protected bool useFadeEffect = true; // 是否使用渐变效果 [SerializeField] protected float fadeInDuration = 0.15f; // 渐变显示时长 [SerializeField] protected float fadeOutDuration = 0.15f; // 渐变隐藏时长 protected CanvasGroupController _fadeController; // 渐变控制器引用 protected virtual void Awake() { // 获取或添加渐变控制器 _fadeController = GetComponent(); if (_fadeController == null && useFadeEffect) { _fadeController = gameObject.AddComponent(); Debug.Log($"为 {gameObject.name} 自动添加了CanvasGroupController组件"); } } // 子类实现打开时的逻辑 public virtual void OnShow(object param = null) { gameObject.SetActive(true); // 如果启用了渐变效果且有渐变控制器,执行渐变显示 if (useFadeEffect && _fadeController != null) { _ = FadeInAsync(); } } // 子类实现关闭时的逻辑 public virtual void OnHide() { // 如果启用了渐变效果且有渐变控制器,执行渐变隐藏 if (useFadeEffect && _fadeController != null) { _ = FadeOutAsync(); } else { gameObject.SetActive(false); } } /// /// 渐变显示(异步方法) /// /// 渐变时长,如果为0则使用默认值 /// 目标CanvasGroup,如果为null则使用当前对象的CanvasGroup /// 异步任务 public virtual async UniTask FadeInAsync(float duration = 0f, CanvasGroup targetCanvasGroup = null) { if (_fadeController != null) { await _fadeController.FadeInAsync(duration > 0 ? duration : fadeInDuration, null, targetCanvasGroup); } } /// /// 渐变隐藏(异步方法) /// /// 渐变时长,如果为0则使用默认值 /// 目标CanvasGroup,如果为null则使用当前对象的CanvasGroup /// 异步任务 public virtual async UniTask FadeOutAsync(float duration = 0f, CanvasGroup targetCanvasGroup = null) { if (_fadeController != null) { await _fadeController.FadeOutAsync(duration > 0 ? duration : fadeOutDuration, null, targetCanvasGroup); // 渐变完成后隐藏游戏对象 gameObject.SetActive(false); } } /// /// 获取渐变控制器 /// public CanvasGroupController FadeController => _fadeController; /// /// 检查是否正在渐变中 /// public bool IsFading => _fadeController != null && _fadeController.IsFading; }