3.面板基类
3.1 知识点
面板基类类图

面板基类思路
每一个 Panel 根节点都挂一个 CanvasGroup。隐藏时把透明度逐渐降到 0,显示时逐渐拉到 1,用同一组件统筹整棵面板的显隐过渡。
创建 BasePanel 脚本
各个具体面板继承它;在基类里声明 CanvasGroup 引用和 alphaSpeed(课内默认 10)。在 Awake 里 GetComponent<CanvasGroup>,没有则为当前物体 AddComponent<CanvasGroup>,避免预制体上漏挂组件。
public abstract class BasePanel : MonoBehaviour
{
//整体控制淡入淡出的画布组 组件
private CanvasGroup canvasGroup;
//淡入淡出的速度
private float alphaSpeed = 10;
protected virtual void Awake()
{
//一开始获取面板上 挂载的 组件 如果没有 我们通过代码 为它添加一个
canvasGroup = this.GetComponent<CanvasGroup>();
if (canvasGroup == null)
canvasGroup = this.gameObject.AddComponent<CanvasGroup>();
}
}
定义 bool 变量 isShow 记录面板是否显示;定义 UnityAction hideCallBack,在淡出结束(alpha 已到 0)时调用,例如由 UIManager 在回调里销毁预制体并从字典移除。子类实现抽象方法 Init() 做按钮监听等;Start() 里调用 Init()。ShowMe():将 isShow 设为 true,alpha 设为 0,之后由 Update() 每帧增大 alpha 做淡入。HideMe(callBack):将 isShow 设为 false,alpha 设为 1,并记下 hideCallBack,之后由 Update() 每帧减小 alpha 做淡出。Update():若 isShow 且 alpha 未到 1,则增大 alpha;若 !isShow 则减小 alpha,当 alpha <= 0 时钳为 0 并调用 hideCallBack。
//是否开始显示
private bool isShow;
//当自己淡出成功时 要执行的委托函数
private UnityAction hideCallBack;
protected virtual void Start()
{
Init();
}
/// <summary>
/// 主要用于 初始化 按钮事件监听等等内容
/// </summary>
public abstract void Init();
/// <summary>
/// 显示自己时 做的事情
/// </summary>
public virtual void ShowMe()
{
isShow = true;
canvasGroup.alpha = 0;
}
/// <summary>
/// 隐藏自己时 做的事情
/// </summary>
public virtual void HideMe( UnityAction callBack )
{
isShow = false;
canvasGroup.alpha = 1;
//记录 传入的 当淡出成功后会执行的函数
hideCallBack = callBack;
}
void Update()
{
//淡入
if( isShow && canvasGroup.alpha != 1 )
{
canvasGroup.alpha += alphaSpeed * Time.deltaTime;
if( canvasGroup.alpha >= 1 )
canvasGroup.alpha = 1;
}
//淡出
else if( !isShow)
{
canvasGroup.alpha -= alphaSpeed * Time.deltaTime;
if(canvasGroup.alpha <= 0)
{
canvasGroup.alpha = 0;
//应该让管理器 删除自己
hideCallBack?.Invoke();
}
}
}
3.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public abstract class BasePanel : MonoBehaviour
{
//整体控制淡入淡出的画布组 组件
private CanvasGroup canvasGroup;
//淡入淡出的速度
private float alphaSpeed = 10;
//是否开始显示
private bool isShow;
//当自己淡出成功时 要执行的委托函数
private UnityAction hideCallBack;
protected virtual void Awake()
{
//一开始获取面板上 挂载的 组件 如果没有 我们通过代码 为它添加一个
canvasGroup = this.GetComponent<CanvasGroup>();
if (canvasGroup == null)
canvasGroup = this.gameObject.AddComponent<CanvasGroup>();
}
protected virtual void Start()
{
Init();
}
/// <summary>
/// 主要用于 初始化 按钮事件监听等等内容
/// </summary>
public abstract void Init();
/// <summary>
/// 显示自己时 做的事情
/// </summary>
public virtual void ShowMe()
{
isShow = true;
canvasGroup.alpha = 0;
}
/// <summary>
/// 隐藏自己时 做的事情
/// </summary>
public virtual void HideMe( UnityAction callBack )
{
isShow = false;
canvasGroup.alpha = 1;
//记录 传入的 当淡出成功后会执行的函数
hideCallBack = callBack;
}
void Update()
{
//淡入
if( isShow && canvasGroup.alpha != 1 )
{
canvasGroup.alpha += alphaSpeed * Time.deltaTime;
if( canvasGroup.alpha >= 1 )
canvasGroup.alpha = 1;
}
//淡出
else if( !isShow)
{
canvasGroup.alpha -= alphaSpeed * Time.deltaTime;
if(canvasGroup.alpha <= 0)
{
canvasGroup.alpha = 0;
//应该让管理器 删除自己
hideCallBack?.Invoke();
}
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com