3.面板基类
3.1 知识点
查看面板基类类图
声明抽象面板基类BasePanel脚本,继承自 MonoBehaviour 类
public abstract class BasePanel : MonoBehaviour
定义私有变量 canvasGroup,用于控制面板透明度,并设置默认的淡入淡出速度 alphaSpeed
private CanvasGroup canvasGroup;
private float alphaSpeed = 10;
声明公共布尔型变量 isShow,表示当前面板是隐藏还是显示,默认为隐藏状态
public bool isShow = false;
声明私有委托类型变量 hideCallBack,用于在隐藏完成后执行回调函数
private UnityAction hideCallBack = null;
在Awake虚方法中获取面板上挂载的 CanvasGroup 组件,如果没有则添加该组件
protected virtual void Awake()
{
canvasGroup = this.GetComponent<CanvasGroup>();
if (canvasGroup == null)
canvasGroup = this.gameObject.AddComponent<CanvasGroup>();
}
声明抽象方法 Init,用于注册控件事件,所有子面板都必须实现该方法
public abstract void Init();
在Start虚方法中调用 Init 方法进行初始化操作
protected virtual void Start()
{
Init();
}
声明虚方法 ShowMe,在面板显示时进行逻辑处理,设置面板的透明度为0,表示完全透明,将 isShow 设置为 true。会在Update逐渐让透明度加上来。
public virtual void ShowMe()
{
canvasGroup.alpha = 0;
isShow = true;
}
声明虚方法 HideMe,在面板隐藏时进行逻辑处理,设置面板的透明度为1,表示完全不透明,将 isShow 设置为 false,并保存回调函数 callBack。会在Update逐渐让透明度减到0。
public virtual void HideMe( UnityAction callBack )
{
canvasGroup.alpha = 1;
isShow = false;
hideCallBack = callBack;
}
在 Update 方法中实现淡入和淡出的逻辑。当面板处于显示状态且透明度不为1时,透明度不断增加直到达到1;当面板处于隐藏状态且透明度不为0时,透明度不断减少直到达到0,并在透明度为0时调用回调函数 hideCallBack
void Update()
{
if( isShow && canvasGroup.alpha != 1)
{
canvasGroup.alpha += alphaSpeed * Time.deltaTime;
if (canvasGroup.alpha >= 1)
canvasGroup.alpha = 1;
}
else if( !isShow && canvasGroup.alpha != 0)
{
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;
// 当前是隐藏还是显示
public bool isShow = false;
// 当隐藏完毕后想要做的事情
private UnityAction hideCallBack = null;
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()
{
// 设置面板透明度为0,表示完全透明
canvasGroup.alpha = 0;
// 将isShow设置为true,表示正在显示
isShow = true;
}
/// <summary>
/// 隐藏自己时做的逻辑
/// </summary>
public virtual void HideMe( UnityAction callBack )
{
// 设置面板透明度为1,表示完全不透明
canvasGroup.alpha = 1;
// 将isShow设置为false,表示正在隐藏
isShow = false;
// 保存回调函数,在透明度为0时调用回调函数
hideCallBack = callBack;
}
void Update()
{
// 当处于显示状态且透明度不为1时,进行淡入逻辑
if( isShow && canvasGroup.alpha != 1)
{
// 通过改变透明度实现淡入效果
canvasGroup.alpha += alphaSpeed * Time.deltaTime;
if (canvasGroup.alpha >= 1)
canvasGroup.alpha = 1; // 保证透明度不超过1
}
// 当处于隐藏状态且透明度不为0时,进行淡出逻辑
else if( !isShow && canvasGroup.alpha != 0)
{
// 通过改变透明度实现淡出效果
canvasGroup.alpha -= alphaSpeed * Time.deltaTime;
if (canvasGroup.alpha <= 0)
{
canvasGroup.alpha = 0; // 保证透明度不小于0
// 在透明度变为0之后执行回调函数
hideCallBack?.Invoke();
}
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com