Unity MVC丨(四)View:创建UI窗体的存放物体、UIRoot管理类

2024-08-15 19:01:05 浏览数 (2)

大家好,我是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

0 人点赞