Unity中简单 UI 管理类 - UIManager

本文介绍了一个Unity游戏开发中使用的UI管理系统,该系统通过泛型方法实现界面的切换,并使用列表记录当前打开的所有页面,以便能够返回到之前的界面。此外,还提供了如何在项目中使用这个UI管理系统的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进入下一个界面

    // Enter Next UI;
    // MonoBehaviour can replace your UIBase Class;
    public T Enter<T>() where T: MonoBehaviour
    {
        foreach(var o in mUIList)
        {            
            T ui = o.GetComponent<T>();
            if(ui!=null)
            {
                if(mGo_CurPage!=null)
                {
                    mGo_CurPage.SetActive(false);
                }
                ui.gameObject.SetActive(true);

                // ui init;
                // ...
                // ...

                mGo_CurPage = ui.gameObject;
                mCurOpenList.Add(mGo_CurPage);
                return ui;
            }
        }
        return null;
    }

这里可以不继承MonoBehaviour类,可以自己定义一个 UIBase 类,用于一些初始化等操作

返回上一个界面

    // Return Before UI;
    public void Back()
    {
        for(int i=mCurOpenList.Count-1;i>=0;--i)
        {
            if(i>=0)
            {

                if(i-1>=0)
                {
                    // before page;
                    mCurOpenList[i-1].SetActive(true);
                    // cur page;
                    mCurOpenList[i].SetActive(false);

                    RemoveOpenList(mGo_CurPage);

                    mGo_CurPage = mCurOpenList[i-1];
                    return ;
                }
            }
        }
    }

使用

例如你写了三个界面(三个Class)分别为

UIPage1
UIPage2
UIPage3

将这三个 Class 都挂在 gameObject 上面,拖到如图所示的地方
UIManager

外部即可直接调用

UIManager.Enter();
UIManager.Back();

你也可以自己在外面再封装一层

完整代码

using System;
using System.Collections.Generic;
using UnityEngine;
public class UIPage1
{

}
public class UIPage2
{

}
public class UIPage3
{

}
public class UIManager : MonoBehaviour
{     
    public bool Debug = true;
    public List<GameObject> mUIList = new List<GameObject>();

    private List<GameObject> mCurOpenList = new List<GameObject>();
    private GameObject mGo_CurPage=null;

    void Start()
    {
        if(!Debug)
        {
            Enter<UIPage1>();
        }
    }

    // Enter Next UI;
    // MonoBehaviour can replace your UIBase Class;
    public T Enter<T>() where T:MonoBehaviour
    {
        foreach(var o in mUIList)
        {            
            T ui = o.GetComponent<T>();
            if(ui!=null)
            {
                if(mGo_CurPage!=null)
                {
                    mGo_CurPage.SetActive(false);
                }
                ui.gameObject.SetActive(true);

                // ui init;
                // ...
                // ...

                mGo_CurPage = ui.gameObject;
                mCurOpenList.Add(mGo_CurPage);
                return ui;
            }
        }
        return null;
    }

    // Return Before UI;
    public void Back()
    {
        for(int i=mCurOpenList.Count-1;i>=0;--i)
        {
            if(i>=0)
            {

                if(i-1>=0)
                {
                    // before page;
                    mCurOpenList[i-1].SetActive(true);
                    // cur page;
                    mCurOpenList[i].SetActive(false);

                    RemoveOpenList(mGo_CurPage);

                    mGo_CurPage = mCurOpenList[i-1];
                    return ;
                }
            }
        }
    }

    // Remove Opened UI;
    void RemoveOpenList(GameObject go)  
    {
        for(int i=0;i<mCurOpenList.Count;++i)
        {
            if(mCurOpenList[i] ==go)
            {
                mCurOpenList.RemoveAt(i);
                return;
            }
        }
    }
}
### 创建和使用 Unity UI 管理的最佳实践 #### 设计模式的选择 为了有效地管理和维护复杂的用户界面,在设计UI管理系统时推荐采用单例模式或事件驱动架构。这有助于集中控制UI逻辑并减少不同脚本间的耦合度[^1]。 #### 单一入口点 构建一个统一的接口作为所有UI交互操作的起点是非常重要的。此接口应该能够处理诸如显示/隐藏面板、更新文本内容以及响应按钮点击等功能调用。通过这种方式,其他部分的游戏代码只需要知道这个单一入口而不需要直接访问各个具体的UI组件实例[^2]。 ```csharp public class UIManager : MonoBehaviour { private static UIManager _instance; public static UIManager Instance { get{return _instance;} } void Awake(){ if (_instance != null && _instance != this){ Destroy(this.gameObject); }else{ _instance = this; } } } ``` #### 资源预加载与缓存机制 对于频繁使用的UI元素(如菜单背景图),可以在游戏启动初期就预先加载到内存中,并在整个运行期间保持其可用状态;而对于那些不常出现但在特定场景下又必不可少的对象,则应考虑按需动态加载以节省初始载入时间和占用空间。此外,还可以利用对象池技术来重复利用已经存在的GameObject实例而不是每次都重新创建销毁它们,从而提高效率降低GC压力[^3]。 #### 数据绑定支持 引入数据模型层并与视图层分离可以使UI更加灵活易于扩展。当业务需求发生变化时只需调整背后的数据结构即可自动反映至前端界面上,无需修改大量硬编码式的属性赋值语句。MVVM (Model-View-ViewModel) 或 MVC(Model View Controller) 是两种常见的用于实现这种解耦效果的设计框架[^4]。 #### 性能监控工具的应用 定期审查应用程序性能指标可以帮助识别潜在瓶颈所在之处进而采取针对性措施加以改进。Unity Profiler提供了详尽的时间线分析报告,其中包括了渲染帧率统计、CPU/GPU耗时分布情况等重要参数,这些都是评估现有UI体系健康状况不可或缺的信息来源之一[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值