大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容
本系列博客地址:传送门
一、视图层总览
二、创建基类BaseWindow
在View文件夹下创建基类BaseWindow脚本,该基类完成了对所有UI通用属性、功能的定义,供控制层使用。
定义的属性如下:
- 该基类会作用在所有窗体(我们某个功能根节点)上,比如登陆窗体、商城窗体等。
- 该基类定义了所有窗体共有的属性,比如:是否常驻、可见性等。
- 该基类定义了所有窗体可能用到的共有的组件,比如窗体下所有的按钮,供控制层使用。
- 该基类定义了所有窗体共有的生命周期,比如每次打开、关闭、初始化。
- 该基类定义了给子类使用的接口,比如:添加事件、移除事件
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相比,大概可以感觉到一点逻辑清晰了
下节见