91 lines
3.1 KiB
C#
91 lines
3.1 KiB
C#
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<CanvasGroupController>();
|
||
if (_fadeController == null && useFadeEffect)
|
||
{
|
||
_fadeController = gameObject.AddComponent<CanvasGroupController>();
|
||
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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 渐变显示(异步方法)
|
||
/// </summary>
|
||
/// <param name="duration">渐变时长,如果为0则使用默认值</param>
|
||
/// <param name="targetCanvasGroup">目标CanvasGroup,如果为null则使用当前对象的CanvasGroup</param>
|
||
/// <returns>异步任务</returns>
|
||
public virtual async UniTask FadeInAsync(float duration = 0f, CanvasGroup targetCanvasGroup = null)
|
||
{
|
||
if (_fadeController != null)
|
||
{
|
||
await _fadeController.FadeInAsync(duration > 0 ? duration : fadeInDuration, null, targetCanvasGroup);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 渐变隐藏(异步方法)
|
||
/// </summary>
|
||
/// <param name="duration">渐变时长,如果为0则使用默认值</param>
|
||
/// <param name="targetCanvasGroup">目标CanvasGroup,如果为null则使用当前对象的CanvasGroup</param>
|
||
/// <returns>异步任务</returns>
|
||
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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取渐变控制器
|
||
/// </summary>
|
||
public CanvasGroupController FadeController => _fadeController;
|
||
|
||
/// <summary>
|
||
/// 检查是否正在渐变中
|
||
/// </summary>
|
||
public bool IsFading => _fadeController != null && _fadeController.IsFading;
|
||
} |