大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容
本系列博客地址:传送门
一、本节概述
上节我们完成了View视图层基类 BaseWindow 的创建,那么视图层管理的UI生成在面板的哪个位置呢?哪个类控制UI的位置呢?因此,就有了本节内容:
- 创建“UI窗体的存放物体”,这个物体名为UIRoot,用以存放我们生成的UI
- “窗体管理类UIRoot”,这个类,用以自动生成UIRoot、将我们的UI设置到UIRoot中对应的位置去。
二、创建UI窗体的存放物体
1、创建如下预制体
创建预制体,并放在Resources/UI下。该UI意义如下:
- UIRoot:是一个Canvas。
- recyclePool:存放已经关闭的窗体
- workstation:存放正在显示的窗体
- noticestation:存放打开的、提示类型的窗体
2、修改预制体锚点
将recyclePool、workstation、workstation三个物体的锚点,从居中改为将锚点定在四角。
记得Apply一下。
三、UIRoot管理类
Assets/MVCLibrary下,创建UIRoot脚本,该脚本完成了:
- 若不存在存放UI窗体的UIRoot物体,就自动从Resources创建它
- 拥有公开接口,用以设置UI窗体的父物体(位于UIRoot哪个物体下)
内容如下:
代码语言:javascript复制using UnityEngine;
public class UIRoot
{
private static Transform transform;
/// <summary>
/// 回收的窗体(隐藏)
/// </summary>
private static Transform recyclePool;
/// <summary>
/// 前台显示的工作的窗体
/// </summary>
private static Transform workstation;
/// <summary>
/// 提示类型的窗体
/// </summary>
private static Transform noticestation;
private static bool isInit = false;
public static void Init()
{
if (transform == null)
{
var obj = Resources.Load<GameObject>("UI/UIRoot");
transform = GameObject.Instantiate(obj).transform;
}
if (recyclePool == null)
{
recyclePool = transform.Find("recyclePool");
}
if (workstation == null)
{
recyclePool = transform.Find("workstation");
}
if (noticestation == null)
{
recyclePool = transform.Find("noticestation");
}
isInit = true;
}
public static void SetParent(Transform window, bool isOpen, bool isTipsWindow = false)
{
if (isInit == false)
Init();
if (isOpen)
{
if (isTipsWindow)
{
window.SetParent(noticestation, false);
}
else
{
window.SetParent(workstation, false);
}
}
else
{
window.SetParent(recyclePool, false);
}
}
}
好了,下章见
一起进步
我是SKODE