首页 > 其他分享 >Unity游戏框架设计之UI管理器

Unity游戏框架设计之UI管理器

时间:2024-05-01 15:55:05浏览次数:13  
标签:管理器 string Unity UI sceneAssetPath public uiName

Unity游戏框架设计之UI管理器

简单介绍

在游戏开发过程中,我们通常需要管理 UI 游戏对象的加载、打开和销毁等操作,同时也需要管理游戏数据和游戏数据在 UI 上的显示,因此我们需要一个 UI 管理器来统一实现上述基础功能。

我们可以基于 MVC 模式编写 UI 管理器,此时 UI 管理器将分为模型管理器(Model)、视图管理器(View)和控制管理器(Controller)。

UI模型管理器

简单介绍

UI 模型管理器主要管理 UI 上数据的设置和读取。为了将数据显示到 UI 上,则必须选定一个 UI 组件作为载体。对于不同的 UI 组件,则有不同的设置和读取方法。因此引入 UIModelType 类来区分不同的 UI 组件。

下述代码以 UI 组件中的 TextMeshProUGUI 组件为例,分别编写对应的 UI 组件的模型管理器。然后编写 UI 模型管理器来统一管理所有 UI 组件中的模型,并以 UIModelType 作为区分不同 UI 的标识符。

代码设计

public enum UIModelType
{
    TextMeshProUGUI
}
public class UITextMeshProGUIModelManager : SingletonMono<UITextMeshProGUIModelManager>
{
    public string GetTextModel(string sceneAssetPath, string uiName, string gameObjectName)
    {
        return UIManager.Instance.FindUIComponentByName<TextMeshProUGUI>(sceneAssetPath, uiName, gameObjectName).text;
    }

    public void SetTextModel(string sceneAssetPath, string uiName, string gameObjectName, string text)
    {
        UIManager.Instance.FindUIComponentByName<TextMeshProUGUI>(sceneAssetPath, uiName, gameObjectName).text = text;
    }
}
public class UIModelManager : SingletonMono<UIModelManager>
{
    protected override void Awake()
    {
        base.Awake();
        gameObject.AddComponent<UITextMeshProGUIModelManager>();
    }

    public string GetModel(string sceneAssetPath, string uiName, string gameObjectName, UIModelType type)
    {
        switch (type)
        {
            case UIModelType.TextMeshProGUI:
                return UITextMeshProGUIModelManager.Instance.GetTextModel(sceneAssetPath, uiName, gameObjectName);
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    public void SetModel(string sceneAssetPath, string uiName, string gameObjectName, string value, UIModelType type)
    {
        switch (type)
        {
            case UIModelType.TextMeshProGUI:
                UITextMeshProGUIModelManager.Instance.SetTextModel(sceneAssetPath, uiName, gameObjectName, value);
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

UI视图管理器

简单介绍

UI 视图管理器主要管理 UI 的资源加载、UI 的打开、UI 的关闭、UI 的销毁。UI 视图管理器依赖于场景管理器(不是 Unity 官方 API 而是自己实现的游戏框架中的场景管理器),因为 UI 视图管理器的操作与场景管理器的操作类似。UI 的资源加载,实际上就是将资源加载到场景中。UI 的打开,实际上就是场景中游戏对象的激活。UI 的关闭,实际上就是场景中游戏对象的禁用。UI 的销毁,实际上就是场景中游戏对象的销毁。

代码设计

public class UIViewManager : SingletonMono<UIViewManager>
{
    public GameObject LoadUI(string sceneAssetPath, string uiAssetPath, string uiName)
    {
        return SceneManager.Instance.LoadRootPrefab(sceneAssetPath, uiAssetPath, uiName);
    }

    public (GameObject, T) LoadUI<T>(string sceneAssetPath, string uiAssetPath, string uiName) where T : Component
    {
        GameObject prefab = SceneManager.Instance.LoadRootPrefab(sceneAssetPath, uiAssetPath, uiName);
        T component = AddUIComponent<T>(sceneAssetPath);
        return (prefab, component);
    }

    public GameObject OpenUI(string sceneAssetPath, string uiName)
    {
        return SceneManager.Instance.ActiveRootPrefab(sceneAssetPath, uiName);
    }

    public GameObject LoadAndOpenUI(string sceneAssetPath, string uiAssetPath, string uiName)
    {
        return SceneManager.Instance.LoadAndActiveRootPrefab(sceneAssetPath, uiAssetPath, uiName);
    }

    public (GameObject, T) LoadAndOpenUI<T>(string sceneAssetPath, string uiAssetPath, string uiName) where T : Component
    {
        GameObject prefab = LoadAndOpenUI(sceneAssetPath, uiAssetPath, uiName);
        T component = AddUIComponent<T>(sceneAssetPath);
        return (prefab, component);
    }

    public void CloseUI(string sceneAssetPath, string uiName)
    {
        SceneManager.Instance.InactiveRootPrefab(sceneAssetPath, uiName);
    }

    public void CloseAndDestroyUI(string sceneAssetPath, string uiName)
    {
        SceneManager.Instance.InactiveAndDestroyRootPrefab(sceneAssetPath, uiName);
    }

    private T AddUIComponent<T>(string sceneAssetPath) where T : Component
    {
        return SceneManager.Instance.AddRootGameObjectComponent<T>(sceneAssetPath);
    }
}

UI控制管理器

简单介绍

UI 控制管理器主要用于控制 UI 事件的处理。首先我们通过 UI 控制管理器向 UI 添加 UI 事件的监听器,然后当 UI 事件触发时,将自动执行监听器中的代码来完成对 UI 事件的处理。下面以 Button 组件的事件监听器的绑定作为例子,编写 UI 控制管理器。

代码设计

public class UIControllerManager : SingletonMono<UIControllerManager>
{
    public void AddListenerOnButtonClick(string sceneAssetPath, string uiName, string gameObjectName, Action onButtonClick)
    {
        UIManager.Instance.FindUIComponentByName<Button>(sceneAssetPath, uiName, gameObjectName).onClick.AddListener(() => onButtonClick());
    }
}

代码说明

(一)使用 UI 控制管理器时,必须在场景中添加 EventSystem 组件,否则 UI 事件将不会触发。

(二)允许重复添加事件监听器。

(三)向 UI 添加 UI 事件的监听器后,不需要主动在 UI 被禁用或者被销毁时删除 UI 事件的监听器,监听的删除操作由 Unity 自动完成。

后记

由于个人能力有限,文中不免存在疏漏之处,恳求大家斧正,一起交流,共同进步。

标签:管理器,string,Unity,UI,sceneAssetPath,public,uiName
From: https://www.cnblogs.com/kkelin/p/18169410

相关文章

  • 【Swing】UI外观风格设置
    设置系统风格UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());1、Metal风格(默认)StringlookAndFeel="javax.swing.plaf.metal.MetalLookAndFeel";UIManager.setLookAndFeel(lookAndFeel);2、Windows风格StringlookAndFeel="com.sun.java......
  • threejs - js库 gui 的使用 调试开发3D效果
    //导入threejsimport*asTHREEfrom"three";import{OrbitControls}from"three/examples/jsm/controls/OrbitControls.js";//引入dat.gui.js的一个类GUIimport{GUI}from'three/addons/libs/lil-gui.module.min.js';//创建场景scene......
  • TextMeshPro - 和UGUI Text的简单对比
    已经有uguiText了,为什么还要再来个TextMeshPro?1)TextMeshPro使用了更先进的渲染技术,渲染效果更好。同样的36号斜体字在Scene窗口中,我们放大后,Text可以明显的看到锯齿,而TextMeshPro字体的边缘还是圆润光滑。2)TextMeshPro默认支持多种渐变效果3) 性能更好的描边(TextMes......
  • ACK One x OpenKruiseGame 全球游戏服多地域一致性交付最佳实践
    作者:刘秋阳、蔡靖前言在当今全球一体化的经济环境下,数字娱乐产业正日益成为文化和商业交流的有力代表。在此背景下大量游戏厂商尝试游戏出海并取得了令人瞩目的成绩,许多游戏以全球同服架构吸引着世界各地广泛的玩家群体。游戏全球化部署不仅扩大了单个产品的市场规模,而且提高了......
  • BurpSuite连接浏览器代理无法打开部分网页问题
    本人写这篇记录时,尚未熟悉bp基本操作,仅记录该次探索bp功能解决问题的心路历程。发现并解决问题最近两天为能打开尘封已久的bp,抓包做题,卸载了jdk20,下了jdk1.8(高版本jdk破解用的java命令完全不能执行,挣扎了一天尝试找功能相同的jdk20代码,以失败告终),一顿操作后发现居然有的页面还是......
  • Unity游戏框架设计之缓存池管理器
    Unity游戏框架设计之缓存池管理器简单介绍在游戏运行的过程中,我们可能遇到这样的需求,即创建大量相同类型的敌人。在传统方法中,我们将对每一个敌人都重新创建,但这样是效率低且占据内存的。为此我们可以这样做,所有敌人在创建时,都从敌人缓存池中取出敌人对象,当敌人死亡时,则将敌人......
  • Locust性能测试设置持续时间(web-UI)
    jemter的线程组可以设置调度器的持续时间,这样如压测1分钟,半小时,一个小时就非常方便 但我们想要设定locust持续运行时间,web-UI页面是不支持的。解决办法有2个,主要讲第二个:1、通过命令行的方式来启动,我们可以配置locust启动配置参数,参考https://blog.csdn.net/weixin_4580533......
  • 密码管理器---KaPass v1.0.3
    伴随的网龄的增加,密码也随之增加,简单的密又怕不安全,复杂的密码怕记不住。就是在这样的情况下,KaPass密码管理器应运而生。一个密码管理器---KaPass,简洁的界面,功能齐全,一起了解一下KaPass: 1、登陆窗口2、主界面3、新增群组,可自定义群组图标4、新增密码,可以储存各式各样......
  • Unity游戏框架设计之音频管理器
    Unity游戏框架设计之音频管理器简单介绍在游戏中,主要的音频分为两种类型。第一种类型是BGM(背景音乐),第二种类型是音效。BGM的特点是音频持续时间长,一般在游戏中的同一时间内只能播放一个BGM。音效的特点是音频持续时间短,一般在游戏中的同一时间内允许同时播放多个音效。在下......
  • Unity性能分析(一)流程与工具的使用
    性能分析工作流对于游戏开发是“必备”的,从基本的三方面开始:在修改之前分析:建立基准线在开发过程中分析:确保修改不会影响性能在修改后分析:证明修改产生了预期效果分析工具是开发者的实用工具之一,可以帮助开发者定位代码中的内存问题和性能瓶颈,也能帮助了解Unity引擎底层的运......