3.面板基类

  1. 3.面板基类
    1. 3.1 知识点
      1. 查看面板基类类图
      2. 声明抽象面板基类BasePanel脚本,继承自 MonoBehaviour 类
      3. 定义私有变量 canvasGroup,用于控制面板透明度,并设置默认的淡入淡出速度 alphaSpeed
      4. 声明公共布尔型变量 isShow,表示当前面板是隐藏还是显示,默认为隐藏状态
      5. 声明私有委托类型变量 hideCallBack,用于在隐藏完成后执行回调函数
      6. 在Awake虚方法中获取面板上挂载的 CanvasGroup 组件,如果没有则添加该组件
      7. 声明抽象方法 Init,用于注册控件事件,所有子面板都必须实现该方法
      8. 在Start虚方法中调用 Init 方法进行初始化操作
      9. 声明虚方法 ShowMe,在面板显示时进行逻辑处理,设置面板的透明度为0,表示完全透明,将 isShow 设置为 true。会在Update逐渐让透明度加上来。
      10. 声明虚方法 HideMe,在面板隐藏时进行逻辑处理,设置面板的透明度为1,表示完全不透明,将 isShow 设置为 false,并保存回调函数 callBack。会在Update逐渐让透明度减到0。
      11. 在 Update 方法中实现淡入和淡出的逻辑。当面板处于显示状态且透明度不为1时,透明度不断增加直到达到1;当面板处于隐藏状态且透明度不为0时,透明度不断减少直到达到0,并在透明度为0时调用回调函数 hideCallBack
    2. 3.2 知识点代码

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

×

喜欢就点赞,疼爱就打赏