Unity MVC丨(三)创建View视图层基类:BaseWindow

2024-08-15 19:00:03 浏览数 (2)

大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容

本系列博客地址:传送门

一、视图层总览

二、创建基类BaseWindow

在View文件夹下创建基类BaseWindow脚本,该基类完成了对所有UI通用属性、功能的定义,供控制层使用。

定义的属性如下:

  • 该基类会作用在所有窗体(我们某个功能根节点)上,比如登陆窗体、商城窗体等。
  • 该基类定义了所有窗体共有的属性,比如:是否常驻、可见性等。
  • 该基类定义了所有窗体可能用到的共有的组件,比如窗体下所有的按钮,供控制层使用。
  • 该基类定义了所有窗体共有的生命周期,比如每次打开、关闭、初始化。
  • 该基类定义了给子类使用的接口,比如:添加事件、移除事件
代码语言:javascript复制
using UnityEngine;
using UnityEngine.UI;

namespace MVCLibrary.View
{
    public class BaseWindow
    {
        //定义用到的属性(因为我们现在不继承Mono了,所以需要自己定义)

        #region 基础属性

        /// <summary>
        /// UI物体
        /// </summary>
        protected Transform transform;

        /// <summary>
        /// 资源名称(UI预制体的存放路径)
        /// </summary>
        protected string resName;

        /// <summary>
        /// 是否常驻(若不是常驻,只用一次,那么便关闭后,就将其销毁掉)
        /// </summary>
        protected bool resident;

        /// <summary>
        /// 是否可见
        /// </summary>
        protected bool visable = false;

        /// <summary>
        /// 窗体类型
        /// </summary>
        protected WindowType selfType;

        /// <summary>
        /// 场景类型
        /// </summary>
        protected SceneType sceneType;

        #endregion


        #region UI控件

        /// <summary>
        /// 按钮列表
        /// </summary>
        protected Button[] ButtonLists;

        #endregion


        #region 需要给子类提供的接口

        /// <summary>
        /// 初始化
        /// </summary>
        protected virtual void Awake()
        {
            ButtonLists = transform.GetComponentsInChildren<Button>(true);
            RegisterUiEvent();
        }

        /// <summary>
        /// UI事件的注册
        /// </summary>
        protected virtual void RegisterUiEvent()
        {
        }

        /// <summary>
        /// 添加事件
        /// </summary>
        protected virtual void OnAddListener()
        {
        }

        /// <summary>
        /// 移除事件,触发移除所有的游戏事件
        /// </summary>
        protected virtual void OnRemoveListener()
        {
        }

        /// <summary>
        /// 每次打开,触发了添加的打开事件
        /// </summary>
        protected virtual void OnEnable()
        {
        }

        /// <summary>
        /// 每次关闭,触发了添加的隐藏事件
        /// </summary>
        protected virtual void OnDisable()
        {
        }

        /// <summary>
        /// 每帧更新
        /// </summary>
        /// <param name="deltaTime">两帧间隔的时间</param>
        protected virtual void Update(float deltaTime)
        {
        }

        #endregion


        #region 窗体管理方法

        /// <summary>
        /// 创建UI窗体
        /// </summary>
        /// <returns>是否创建成功</returns>
        private bool Create()
        {
            if (string.IsNullOrEmpty(resName))
            {
                return false;
            }

            if (transform == null)
            {
                var obj = Resources.Load<GameObject>(resName);
                if (obj == null)
                {
                    Debug.LogError($"未找到预制件{selfType}");
                    return false;
                }

                transform = GameObject.Instantiate(obj).transform;

                transform.gameObject.SetActive(false);

                UIRoot.SetParent(transform, false, selfType == WindowType.TipsWindow);

                return true;
            }

            return true;
        }

        #endregion
    }

    /// <summary>
    /// 窗体的类型
    /// </summary>
    public enum WindowType
    {
        LoginWindow, //登录窗体
        StoreWindow, //商城窗体
        TipsWindow //提示窗体
    }

    /// <summary>
    /// 场景的类型,目的是提供根据场景类型,进行预加载
    /// </summary>
    public enum SceneType
    {
        None, //空场景
        Login, //登录场景
        Battle //对战场景
    }
}

好啦,视图层基类已创建完成,和之前的Mono相比,大概可以感觉到一点逻辑清晰了

下节见

0 人点赞