Unity3d的ugui如果用得不好,非常的影响性能,可能很多人都不知道,其实ugui是基于网格模型渲染的,一个ugui组件就是一个Mesh,ui组件的Material为空,其实他是用了默认的Material,我们在运行游戏的时候Canvas回把所有ui的Mesh合并成一个大的ShareMesh,用于渲染。所以一般情况下,ui的DrawCall会比较少,但是不一般的情况下,我们会用到动态的ui,导致cpu实时在合并网格顶点,gpu重新渲染整个ShareMesh,这就很卡了,所以我们要尽量不要用动态的ui,这怎么可能

扯了一下不相干的事,接下来我们来讲讲怎么来写一个简单的ui系统。

一个好的框架,底层少不了接口,所以我们创建一个UI的接口IView。

// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-15
// Desc:
// **********************************************************************using System.Collections;
using System.Collections.Generic;
using UnityEngine;public interface IView {/// <summary>/// 绑定组件/// </summary>void BindComponent();/// <summary>/// 注册事件/// </summary>void RegistrationEvent();/// <summary>/// 注销事件/// </summary>void UnregisterEvent();/// <summary>/// 初始化/// </summary>void Init();/// <summary>/// 关闭/// </summary>void Close();
}

2.接下来我们来创建一个ui的基类UIBase。

// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-15
// Desc:
// **********************************************************************using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIBase : Base, IView
{public object[] param;public UIType uiType;public PanelType panelType;protected void Awake(){BindComponent();RegistrationEvent();XMAwake();}protected void Start(){Init();}public virtual void XMAwake(){}/// <summary>/// 绑定组件/// </summary>public virtual void BindComponent(){}/// <summary>/// 注册事件/// </summary>public virtual void RegistrationEvent(){}/// <summary>/// 注销事件/// </summary>public virtual void UnregisterEvent(){}/// <summary>/// 关闭/// </summary>public virtual void Close(){}/// <summary>/// 初始化/// </summary>public virtual void Init(){}private void OnDestroy(){UnregisterEvent();Close();param = null;XMUtil.ClearMemory();//Debug.Log("~" + name + " was destroy!");}
}

UIBase根据你们的需求可以相应的扩展,这里只写了ui类型和层级类型。

3.然后我们随便创建一个界面UIMain

// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-18
// Desc:
// **********************************************************************using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class UIMain : UIBase {public Button btn_Attack;public override void BindComponent(){base.BindComponent();}public override void RegistrationEvent(){base.RegistrationEvent();btn_Attack.onClick.AddListener(Attack);}public override void UnregisterEvent(){base.UnregisterEvent();btn_Attack.onClick.RemoveListener(Attack);}public override void Close(){base.Close();}public override void Init(){base.Init();}private void Attack(){SendMessage(BattleEvent.Attack);}
}

每次创建新的界面我们都在UIType上添加新的类型,用于界面的创建和销毁。

public enum UIType
{UIMain,
}

4.最后我们写一个UIManager来管理所有的ui。

using System.Collections;
// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-04-13
// Desc:
// **********************************************************************using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 界面类型
/// </summary>
public enum PanelType
{MainPanel,BottomPanel,TopPanel,TipPanel,
}public class UIManager : Manager {Dictionary<UIType, GameObject> uiMap = new Dictionary<UIType, GameObject>();Transform MainPanel;Transform BottomPanel;Transform TopPanel;Transform TipPanel;void Awake(){Transform tr = AppFacade.Instance.GetManager<GameManager>(ManagerName.Game).uiRoot.transform;MainPanel = tr.Find("MainPanel");BottomPanel = tr.Find("BottomPanel");TopPanel = tr.Find("TopPanel");TipPanel = tr.Find("TipPanel");}/// <summary>/// 打开界面/// </summary>/// <param name="path"></param>/// <returns></returns>public GameObject Show(string path,object[] param = null){GameObject ui = ResManager.CreateAsset(path);UIBase uibase = ui.GetComponent<UIBase>();uibase.param = param;SetPanelParent(uibase);ui.transform.localScale = Vector3.one;ui.transform.localPosition = Vector3.zero;ui.transform.rectTransform().sizeDelta = new Vector2(0, 0);ui.transform.rectTransform().anchoredPosition = new Vector2(0, 0);AddUI(uibase.uiType, ui);return ui;}/// <summary>/// 设置ui的父对象/// </summary>/// <param name="go"></param>void SetPanelParent(UIBase uibase){if (uibase.panelType == PanelType.MainPanel){uibase.transform.SetParent(MainPanel);}else if (uibase.panelType == PanelType.BottomPanel){uibase.transform.SetParent(BottomPanel);}else if (uibase.panelType == PanelType.TopPanel){uibase.transform.SetParent(TopPanel);}else if (uibase.panelType == PanelType.TipPanel){uibase.transform.SetParent(TipPanel);}}void AddUI(UIType uiType, GameObject ui){uiMap.Add(uiType, ui);}void RemoveUI(UIType uiType){if (uiMap.ContainsKey(uiType)){Destroy(uiMap[uiType]);uiMap.Remove(uiType);}else{Debug.LogError("CloseUI Fail  >>>>  Not Find " + name);}}/// <summary>/// 关闭面板/// </summary>/// <param name="name"></param>public void Close(UIType uiType){RemoveUI(uiType);}void OnDestroy(){//Debug.Log("~UIManager was destroy!");}
}

我写的这个ui系统是很简单的,主要就是面向对象的思路展示,并不是作为一个框架中完整的UI系统来写的,所以有需要的朋友可以自行拓展。

如果有关注我的朋友,应该看过另一篇文章《Unity3D创建C#自定义模板快速实现基类接口》,我们可以创建一个UI的模版,每次创建新的界面都会自动帮我们实现基类的方法。

Unity3D简单的UI系统相关推荐

  1. (转)[Unity3D]UI方案及制作细节(NGUI/EZGUI/原生UI系统) 内附unused-assets清除实例

    转载请留下本文原始链接,谢谢.本文会不定期更新维护,最近更新于2013.09.17. http://blog.sina.com.cn/s/blog_5b6cb9500101bplv.html 一.方案 ...

  2. Unity3D 实现简单的Buff系统

    今天来考虑一下,想要实现一个buff系统需要什么功能. 能力不行,写的不好,请大家指正完善,谢谢~~ 在我们接到一个需求的时候,往往需要先分析一下需求,确定我们要实现什么样的功能,大部分的情况下需求功 ...

  3. 【Unity3d】 教会你如何做一个简单的电梯系统(升降平台)

    博主第一次写博客,语言略俗,有不足之处还请指正! 由于自己还处在unity小白阶段,受2d升降平台的影响(后续我也会上传关于2d升降平台的文章),突发奇想如何用3d做一个电梯系统,查阅网上资料后,发现 ...

  4. 3D Game Programming Design:UI系统--Quest Log 公告牌

    3D Game Programming & Design:UI系统--Quest Log 公告牌 UI系统概述 UGUI 基础 画布(Cavas) UI 布局基础 UI 组件与元素 编程实践 ...

  5. 二.UI系统 [Unity_Learn_RPG_1]

    UI系统 [Unity_Learn_RPG_1] 讲解一个VR项目来学习. 一.VRTK 1.简介 其实就是 VRTK 帮我们做了硬件适配,当作一个中间层,让我们只需要调用它提供的方法即可. 为什么学 ...

  6. UGUI的优点新UI系统

    UGUI的优点新UI系统 第1章  新UI系统概述 UGUI的优点新UI系统,新的UI系统相较于旧的UI系统而言,是一个巨大的飞跃!有过旧UI系统使用体验的开发者,大部分都对它没有任何好感,以至于在过 ...

  7. Unity4.6新UI系统初探(uGUI)

    文章目录[点击展开](?)[+] 一引言 二Rect Transform 三排序 四控件 1 Image 2 Button 五事件 1 Event Trigger 2 Graphic Raycaste ...

  8. 3D游戏与编程——UI系统

    目录 UI系统 Unity GUI简介 IMGUI UGUI 的产生与优势 作业要求 使用UGUI方法制作血条 制作预制 使用IMGUI方法制作血条 结果演示 代码传送门 UI系统 Unity GUI ...

  9. 简单的UI框架 | 一、UI界面的搭建

    简单的UI框架 UI界面的搭建 文章目录 简单的UI框架 前言 一.UI资源的导入 二.游戏主界面设置 1.背景设置 2.游戏主玩法图标按钮 3.游戏主玩法界面 4.预制体 总结 前言 本文将会学习到 ...

最新文章

  1. HTML5的Video标签的属性,方法和事件汇总
  2. field module的on input和on request区别
  3. 【Android】事件传递:向下拦截,向上处理
  4. winscp登陆windows服务器_基于OpenSSH+WinSCP完成Windows服务器之间的文件传输
  5. ubuntu14.04matlab2015b 测试caffe的Matlab接口
  6. Java 并发编程之 FutureTask
  7. SQL2005性能分析一些细节功能你是否有用到?(二)
  8. MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份]
  9. 软件推荐:Microsoft To-Do
  10. 如何简化卷积神经网络_卷积神经网络:简化
  11. vb c语言入门教程,c语言和vb哪个简单
  12. 安利一款倒计时插件---雨滴桌面
  13. 【华为OD】【001-勾股数元组】
  14. 手机端H5页面时间插件
  15. SpringBoot 自动装配原理解析
  16. ubuntu安装软件失败无法安装其他软件的解决办法
  17. 谷歌的无痕模式有什么好处_为什么Google的新搜索结果设计是黑暗的模式
  18. 电子工程师入门宝典:最常用十大电子元器件-电子技术方案|电路图讲解
  19. nmap工具介绍及常用命令
  20. 程序员 520 表白方式

热门文章

  1. java logger
  2. 浏览器下载文件时,总是中断然后重头开始重复下载的解决办法
  3. 下载破 2w+,在校生必看,《程序员内功修炼》第二版出炉
  4. 世界最大主跨径飞燕式系杆拱桥成功吊装首节主拱
  5. matlab中定义数组
  6. 汉字计算机输入的优越性论文,议论文阅读训练中国第五大发明汉字附答案作文...
  7. 永远年轻,永远热泪盈眶
  8. 计算机一次就好音乐普,一次就好(remix 版)
  9. 调用腾讯地图API、高德地图API 获取当前地理位置、经纬度
  10. 马云考计算机吗,马云高考3次数学才及格 俞敏洪英语40分钟就交卷