3.面板基类

3.面板基类


3.1 知识点

面板基类类图

面板基类思路

每一个 Panel 根节点都挂一个 CanvasGroup。隐藏时把透明度逐渐降到 0,显示时逐渐拉到 1,用同一组件统筹整棵面板的显隐过渡。

创建 BasePanel 脚本

各个具体面板继承它;在基类里声明 CanvasGroup 引用alphaSpeed(课内默认 10)。在 AwakeGetComponent<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 设为 truealpha 设为 0,之后由 Update() 每帧增大 alpha 做淡入。HideMe(callBack):将 isShow 设为 falsealpha 设为 1,并记下 hideCallBack,之后由 Update() 每帧减小 alpha 做淡出。Update():若 isShowalpha 未到 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

×

喜欢就点赞,疼爱就打赏