WX-Game1/Assets/Scripts/UI/UIBase.cs

91 lines
3.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}